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