使用此脚本,每个字段都会根据当前文件的最长字打印出来,但每个文件都需要换行。如何实现这一目标?
awk 'BEGIN{ORS="\n"}FNR=NR{a[i++]=$0; if(length($0) > length(max)) max=$0;l=length(max)} END{ for(j=1; j<=i;j++) printf("%-"(l+1)"s,",a[j-1])}' file1 file2 >outfile
文件1
HELLO
WORLD
SOUTH IS
WARM
NORTH IS
COLD
file2的
HELLO
WORLD
SOUTH
WARM
NORTH
COLD
输出
HELLO ,WORLD ,SOUTH IS ,WARM ,NORTH IS ,COLD
HELLO ,WORLD ,SOUTH ,WARM ,NORTH ,COLD
答案 0 :(得分:1)
你要求的并不完全清楚,但也许你只是想要:
FNR==1 {print "\n"}
每当它开始读取文件的第一行时,它将打印换行符。确保此模式/操作先于其他任何模式/操作,以便在任何其他操作为当前文件的第一行打印任何内容之前打印换行符。 (这似乎不适用于您的情况,因为不存在此类行为。)
答案 1 :(得分:0)
花了一些时间,用这个脚本解决了。
awk '{ NR>1 && FNR==1 ? l=length($0) && a[i++]= "\n" $0 : a[i++]=$0 }
{if(NR>1 && FNR==1) for(e=(i-c);e<=(i-1);e++) b[e]=d ;c=FNR; d=l }
{ if( length($0) > l) l=length($0)+1 }
END{for(e=(i-c+1);e<=i;e++) b[e]=d; for(j=1;j<=i;j++) printf("%-"b[j]"s,",a[j-1] )}' infiles* >outfile
答案 2 :(得分:0)
#!/usr/bin/awk -f
function beginfile (file) {
split("", a)
max = 0
delim = ""
}
function endfile (file) {
for (i = 1; i <= lines; i++) {
printf "%s%-*s", delim, max, a[i]
delim = " ,"
}
printf "\n"
}
FILENAME != _oldfilename \
{
if (_oldfilename != "")
endfile(_oldfilename)
_oldfilename = FILENAME
beginfile(FILENAME)
}
END { endfile(FILENAME) }
{
len = length($0)
if (len > max) {
max = len
}
a[FNR] = $0
lines = FNR
}
运行它:
chmod u+x filename
./filename file1 file2
请注意,在gawk
中,您可以delete a
代替split("", a)
。 GAWK 4内置了BEGINFILE
和ENDFILE
。