2012-06-06 49 views
0

使用此脚本,每个字段按照当前文件的最长字打印出来,但每个文件需要换行。这怎么能实现?每个文件后awk换行

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 

文件2

HELLO 
WORLD 
SOUTH 
WARM 
NORTH 
COLD 

输出

HELLO  ,WORLD  ,SOUTH IS ,WARM  ,NORTH IS ,COLD  
HELLO ,WORLD ,SOUTH ,WARM ,NORTH ,COLD 
+0

将'\ n'添加到您正在打印的每一行的末尾。我认为'ORS'只有在你使用'print'而不是'printf'时才会使用。 – Anil

回答

1

这不是完全清楚你所要求的是什么,但也许你只是想:

FNR==1 {print "\n"} 

每当它开始读取文件的第一行时,它将打印一个换行符。确保此模式/动作在任何其他模式/动作之前,以便在任何其他动作为当前文件的第一行输出任何内容之前执行换行。 (这似乎不适用于你的情况,因为没有这样的动作存在。)

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 
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有内置的BEGINFILEENDFILE