Arrays 每个文件后的awk换行符
使用此脚本,每个字段都会根据当前文件的最长单词打印出来,但每个文件都需要换行符。如何做到这一点Arrays 每个文件后的awk换行符,arrays,awk,printf,Arrays,Awk,Printf,使用此脚本,每个字段都会根据当前文件的最长单词打印出来,但每个文件都需要换行符。如何做到这一点 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 文件2 输出 HELLO ,WORLD
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
文件2
输出
HELLO ,WORLD ,SOUTH IS ,WARM ,NORTH IS ,COLD
HELLO ,WORLD ,SOUTH ,WARM ,NORTH ,COLD
你的要求并不完全清楚,但也许你只是想:
FNR==1 {print "\n"}
它将在开始读取文件的第一行时打印换行符。确保此模式/操作在任何其他模式/操作之前,以便换行符在任何其他操作为当前文件的第一行打印任何内容之前打印。(这似乎不适用于您的情况,因为不存在此类操作。)我花了一些时间,用此脚本解决了问题
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
awk'{NR>1&&FNR==1?l=length($0)和&a[i++]=“\n”$0:a[i++]=$0}
{if(NR>1&&FNR==1)for(e=(i-c);el)l=length($0)+1}
结束{for(e=(i-c+1);e
请注意,在gawk
中,您可以执行删除a
而不是拆分(“,a”)
.GAWK 4内置了BEGINFILE
和ENDFILE
在打印的每一行末尾添加\n
。我认为ORS
只会在使用print
时使用,而不会与printf
一起使用。
FNR==1 {print "\n"}
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
#!/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