3

次のようなファイルがあります。

b, 20, 434
a, 20, 23
a, 10, 123
a, 20, 423
a, 10, 89
b, 20, 88
b, 10, 133
b, 10, 99
  1. col1 と col2 の一意の組み合わせごとに、col 3 の最大値を見つけます。(例: すべての col3 の最大値a,10)
  2. 出力を col1 でグループ化 (すべてのa行をまとめて)
  3. 出力を col2 で並べ替えます。

つまり、出力はファイルである必要があります

a, 10, 123
a, 20, 423
b, 10, 133
b, 20, 434

bashスクリプトでこれを行うにはどうすればよいですか? ご協力いただきありがとうございます。

4

2 に答える 2

5

これは仕事をします:

< input sort -k3,3gr | sort -k1,1 -k2,2g -u

3 番目のフィールドで数値の逆順で並べ替え、次に最初に出現したものだけを使用して 1 番目と 2 番目のフィールドで並べ替えます (一意の場合は -u)。

パディングは必要ありません。つまり、次のような行を入力に追加する場合

a, 3, 31

出力は次のとおりです。

a, 3, 31
a, 10, 123
a, 20, 423
b, 10, 133
b, 20, 434
于 2015-12-17T15:14:16.937 に答える
2

これにより、空白がわずかに変更されますが、おそらく許容されます。

awk '$3 > a[$1,$2] { a[$1,$2] = $3 } END {for( k in a) print k a[k]}' input |
    sort -n -t, -k1,1 -k2,2

しかし、その解決策は入力の空白に大きく依存しているため、おそらく次のようにする方がよいでしょう:

awk '$3 > a[$1","$2] { a[$1","$2] = $3 } 
    END {for( k in a) print k "," a[k]}' FS=, input |
    sort -n -t, -k1,1 -k2,2
于 2013-03-13T22:04:45.057 に答える