2つのキーの最大ファイル合計を取得する

2つのキーの最大ファイル合計を取得する

以下のファイルがあります。

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条件を満たしkey1key3一度だけ発生する可能な最大合計を見つけようとします。上記のファイルの場合、出力は次のようになると予想されます。

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

注:これはヘッダーも印刷しますが、メソッドもヘッダーを印刷して出力に表示しないため、ヘッダーは実際にはファイルの一部ではないと仮定します。

関連情報