我有一个文件,我需要用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工具等)。
答案 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()
,但会改为使用多个字符串连接。