0

私はAWKにかなり慣れていないので、質問があります。誰かが私を助けてくれることを願っています:私は次のようなパターンを持っています:

620
621
622
623
624
624 66.75, 150.13
625
625 67.24, 153.31
626
627
628
628 68.14, 151.98

etc,etc

awk スクリプトを使用して、次の結果を達成しようとしています: 数値の最初の列 (カウンター) から重複を削除し、データ (2 番目と 3 番目の列) を連結したい。したがって、データを次のように表示したいと思います。

620
621
622
623
624 66.75, 150.13
625 67.24, 153.31
626
627
628 68.14, 151.98

これまでのところ、最初のフィールドを変数に格納し、次の数値が等しいかどうかをテストするなどのことを試してきました。しかし、重複するフィールドが見つかった場合は、1 ステップ前に戻って、以前に出力された変数を変更する必要があると思います。AWK を使用してこれを行うにはどうすればよいですか? どうもありがとう!

4

3 に答える 3

2

この行はあなたの例で機能します:

 awk '{a[$1]=$0}END{for(x in a)print a[x]}' file

テスト:

kent$  awk '{a[$1]=$0}END{for(x in a)print a[x]}' file
620
621
622
623
624 66.75, 150.13
625 67.24, 153.31
626
627
628 68.14, 151.98

for (x in a)ただし、問題のサンプルデータでは機能しましたが、ファイル内で同じ順序に従うことは保証されないことに注意してください。結果を1列目でソートしたい場合。最も簡単な方法は、awk 出力を a にパイプするsort -nことです。

 awk '{a[$1]=$0}END{for(x in a)print a[x]}' file|sort -n
于 2013-10-21T23:06:10.487 に答える
1

Kent のコードに対する 1 つの小さな調整 (複数の行にデータを含めることができると仮定)

awk '{i=$1;sub(/[0-9]*/,"");a[i]=sprintf("%s %s", a[i], $0);}END{for(x in a)printf("%s %s\n", x, a[x]);}' td | sort

複数の行にデータを含めることができる場合、これによりそれらが連結されます。

于 2013-10-21T23:24:41.640 に答える