0

使用此脚本,每个字段都根据当前文件的最长单词打印出来,但每个文件都需要换行。如何做到这一点?

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  
4

3 回答 3

1

目前尚不完全清楚您要的是什么,但也许您只是想要:

FNR==1 {print "\n"}

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

于 2012-06-06T18:12:00.277 回答
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
于 2012-06-13T10:22:16.067 回答
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.

于 2012-06-17T11:57:52.803 回答