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

How can I pad a file beyond 1024 characters in a unix environment?

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

自然的方法是

awk -F, '{printf("%-1100s\n",[==])}'  src.txt > dst.txt

但是,我收到一条错误消息

awk: formatted string too long
 record number 1

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

有没有更好的方法来绕过这个限制?

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

获取 GNU awk。

$ awk 'BEGIN{printf "%-1100s\n", "foo"}'
     foo

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

如果您在该系统上安装了 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;

你可以试试:

awk '{ pad=1100-length([=10=]); x = [=10=]; 
    while (pad > 0) { x = x " "; pad--}; print x }' src.txt >dst.txt

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

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

awk -F, '{printf("%-900s\n",[=10=])}'  src.txt > tmp1.txt
awk -F, '{printf("%200s\n","")}'  src.txt > tmp2.txt
paste -d "[=10=]" tmp1.txt tmp2.txt > dst.txt

这会生成与

相同的文件
nawk -F, '{printf("%-1100s\n",[=11=])}' src.txt > dst.txt