2

私は awk を勉強してきましたが、解決できない問題に遭遇しました。できれば助けてください。

awk、sort、および uniq -c を使用して生成した 2 つのファイルがあります。

ファイル 1の形式は次のとおりです。

1 aaa.c 10/10/2010

1 bbb.h 1/1/2011

3 ccc.c 2/2/2012

1 ccc.c 20/6/2011

1 ddd.c 1/1/2010

1 ddd.c 2/4/1999

1 ddd.c 7/1/2012

1 ddd.c 10/1/1977

意味: number_of_equal_files name date (つまり、同じ日付の 3 つのファイル ccc.c と別の日付の 1 つのファイル ccc.c)

ファイル 2の形式は次のとおりです。

4 ddd.c

2 ccc.c

3 xxx.c

意味: number_of_different_dates 名 (したがって、ccc.c は 2 つの異なる日付で見つかりました) -> number=1 を持つファイルは、逆 grep を使用して削除したため、何もありません。

私がしたいのは、フォーマットで3番目のファイルを生成することです

number_of_different_dates 名前 日付 1 日付 2 日付 3 日付 4 (...)

何かのようなもの:

2 ccc.c 2/2/2012 20/6/2011 

4 ddd.c 1/1/2010 2/4/1999 7/1/2012 10/1/1977

前もって感謝します!

4

2 に答える 2

2

最初のファイルのみを入力として使用して、その結果を取得できるはずです。以下では、2 つの連想配列を使用しています。1 つ目はファイルが表示された回数を収集し、2 つ目は日付を収集します。ブロックはEND、複数回出現したエントリを出力するだけです。

{
   counts[$2] += 1;
   dates[$2] = sprintf( "%s %s", dates[$2], $3 );
}

END {
   for ( f in dates ) {
      if ( counts[f] > 1 )
     printf( "%d %s %s\n", counts[f], f, dates[f]);
   }
}
于 2012-01-19T14:01:47.643 に答える
1

あなたはこのようなことを試すことができます -

#!/usr/bin/awk -f

NR==FNR{
            a[$3]=$2; b[$2]++;next
       } 

($2 in b){
            printf ("%s %s ", $1,$2);
            for (i in a) 
                if (a[i]==$2) 
                    printf i" "; print ""
          }

テスト:

[jaypal:~/Temp] cat file1
1 aaa.c 10/10/2010

1 bbb.h 1/1/2011

3 ccc.c 2/2/2012

1 ccc.c 20/6/2011

1 ddd.c 1/1/2010

1 ddd.c 2/4/1999

1 ddd.c 7/1/2012

1 ddd.c 10/1/1977

[jaypal:~/Temp] cat file2
4 ddd.c

2 ccc.c

3 xxx.c

[jaypal:~/Temp] ./s.awk ff1 ff2
4 ddd.c 10/1/1977 1/1/2010 2/4/1999 7/1/2012 

2 ccc.c 20/6/2011 2/2/2012 
于 2012-01-19T14:55:47.830 に答える