以下のファイルがあります。
key1 key2 key3
a1 2 l1
a1 2.5 l2
a2 2 l2
a3 2.5 l3
a3 2.1 l4
a3 2.2 l5
key2
条件を満たしkey1
、key3
一度だけ発生する可能な最大合計を見つけようとします。上記のファイルの場合、出力は次のようになると予想されます。
a1 2 l1
a2 2 l2
a3 2.5 l3
次のコマンドを使用すると、
sort -nk2 file | perl -ane '$k{$F[$1]}=$_; END{print "$k{$_}" for keys(%k)}'
私が得た結果は、
a2 2 l2
a1 2.5 l2
a3 2.5 l3
しかし、出力から一度だけkey1
合計を取得し、key3
予想出力で説明する最大合計を取得したいと思います。
編集する
以下の入力ファイルがあります。
a0 11.1 l6
a0 3 l1
a1 14.0 l6
a1 2.5 l2
a2 11.1 l2
a2 2 l2
a3 13.3 l8
a3 2.1 l4
a3 2.5 l7
a4 1.6 l6
a4 1.7 l1
手動でわかるように、上記のファイルの最大重み出力は次のとおりです。
a0 11.1 l6
a2 11.1 l2
a3 13.3 l8
a4 1.7 l1
Gnoucのコマンドによると、awk
私が得た結果は次のとおりです。
a0 11.1 l6
a1 2.5 l2
a3 13.3 l8
a4 1.7 l1
terdonのコマンドによると、perl
私が得た結果は次のとおりです。
a2 2 l2
a4 1.7 l1
a3 13.3 l8
編集3
a1 1 l1
a2 3 l2
a1 4 l3
a3 5 l2
a6 4 l5
a7 3 l2
私が得た結果は、
a3 5 l2
a6 4 l5
a7 3 l2
ご覧のとおり、l2
これは2回繰り返されます。
答え1
それぞれの最初の項目だけを取得したいようですkey1
。
これにより、期待した結果が生成されます。
$ awk '!($1 in a){print;a[$1]}' file
a1 2 l1
a2 2 l2
a3 2.5 l3
修正する
欲しいならkey1
または key3
一度だけ発生する必要があります。
$ awk '!($1 in a) && !($3 in a){print;a[$1];a[$3]}' 1.txt
a1 2 l1
a2 2 l2
a3 2.5 l3
アップデート2
あなたのコメントを読んだ後の解決策は次のとおりです。
$ sort -rnk2 file | awk '!a[$1]++' | awk '!a[$3]++'
a1 14.0 l6
a3 13.3 l8
a2 11.1 l2
a4 1.7 l1
答え2
あなたがしなければならないのは、Perlスクリプトにテストを追加することだけです。キーが3番目のフィールドである別のハッシュを使用し、そのフィールドがまだない場合にのみ各行を印刷します。
$ sort -nk2 file | perl -ane '$k{$F[$1]}=$_ unless $s{$F[2]}++>0;
END{print "$k{$_}" for keys(%k)}'
a3 2.5 l3
a2 2 l2
a1 2 l1
注:これはヘッダーも印刷しますが、メソッドもヘッダーを印刷して出力に表示しないため、ヘッダーは実際にはファイルの一部ではないと仮定します。