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
#!/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

の代わりにingawkを実行できることに注意してください。GAWK 4 にはとが組み込まれています。delete asplit("", a)BEGINFILEENDFILE

于 2012-06-17T11:57:52.803 に答える
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 に答える