如何在 unix 环境中填充超过 1024 个字符的文件?

Posted

技术标签:

【中文标题】如何在 unix 环境中填充超过 1024 个字符的文件?【英文标题】:How can I pad a file beyond 1024 characters in a unix environment? 【发布时间】:2015-03-04 12:43:44 【问题描述】:

我有一个文件,我需要在 bash 脚本中将每一行用空格填充到大约 1100 个字符。文件中的每一行目前有 900 个字符。

这样做的自然方法是

awk -F, 'printf("%-1100s\n",$0)'  src.txt > dst.txt

但是,我收到一个错误提示

awk: formatted string too long
 record number 1

经过网上的一些实验和搜索,我确定格式化字符串awk可以处理的最大行长是1024。

有没有更好的方法来解决这个限制?

(注意:我在 SunOS 5.10 上运行,无法向其中添加 GNU 工具等)

【问题讨论】:

即使使用 BSD awk 也无法重现 试试while read line; do printf "%1100s\n" $line; done < src.txt > dst.txt n.b.,更改为左对齐并在右侧填充 【参考方案1】:

获取 GNU awk。

$ awk 'BEGINprintf "%-1100s\n", "foo"'
     foo

您可能正在使用旧的、损坏的 awk - 在 Solaris 上使用 nawk/usr/xpg4/bin/awk。如果其中一个遇到此问题,请使用另一个。

【讨论】:

我看到您添加了一条注释,上面写着“我在 SunOS 5.10 上运行”。你为什么要标记你的问题 linux 呢???您可能正在使用旧的、损坏的 awk - 在 Solaris 上使用 nawk 或 /usr/xpg4/bin/awk。 Linux->SunOS - 更正了,我的错。 nawk 是答案:nawk -F, 'printf("%1100s\n",$0)' src.txt > dst.txt【参考方案2】:

我想出了另一种解决方案:

awk -F, 'printf("%-900s\n",$0)'  src.txt > tmp1.txt
awk -F, 'printf("%200s\n","")'  src.txt > tmp2.txt
paste -d "\0" tmp1.txt tmp2.txt > dst.txt

这会产生与

相同的文件
nawk -F, 'printf("%-1100s\n",$0)' src.txt > dst.txt 

【讨论】:

更像是绝望 - 10 Q【参考方案3】:

如果您在该系统上安装了perl(可能是),您可以设置这样的脚本,然后像pad.pl input.txt 1100 > output.txt 一样运行它。

#! /usr/bin/perl

open (INPUT, "<$ARGV[0]");
$LENGTH=$ARGV[1];

while (<INPUT>) 
    chomp($_);
    while (length($_) < $LENGTH )  $_ = $_." "; 
    print $_."\n";


close INPUT;

【讨论】:

为什么不直接取行的长度$l 并添加($LENGTH - $l) x " " 呢? 是的,我认为你可以这样做 - 它也应该更快。【参考方案4】:

你可以试试:

awk ' pad=1100-length($0); x = $0; 
    while (pad > 0)  x = x " "; pad--; print x ' src.txt >dst.txt

...完全避免使用printf(),而是使用多个字符串连接。

【讨论】:

以上是关于如何在 unix 环境中填充超过 1024 个字符的文件?的主要内容,如果未能解决你的问题,请参考以下文章

现代 Unix/Linux 系统上的密码是不是仍限制为 8 个字符?

将 UNIX 时间从 json 导入(swift 结构)转换为日期作为字符串并填充表

关于处理超过 1024 个套接字描述符

在 Unix 中如何仅在目录中的几个文件中搜索字符串

如何删除某个目录(在 Mac 终端中)-unix 中文件名的最后 n 个字符?

如何判断文件是否超过/ bin / sh 30分钟?