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

时间:2015-01-06 19:16:39

标签: bash unix awk sh sunos

我有一个文件,我需要用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工具等)。

4 个答案:

答案 0 :(得分:4)

获取GNU awk。

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

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

答案 1 :(得分: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 

答案 2 :(得分:1)

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

答案 3 :(得分:0)

你可以尝试:

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

...它完全避免使用printf(),但会改为使用多个字符串连接。