1~3列全体と共通4列の最大値を求めます。

1~3列全体と共通4列の最大値を求めます。

入力txtファイルが与えられた場合:

$ cat input.txt
-1 23 34 cheese
34 20 15 cheese
-4 -4 20 tomato
13 -3 14 tomato
4  6   7 tomato
-3 -3 -3 potato

以下を使用して、列1の最大値にレコードを保持しながら、列4に基づいてデータを統合できます。

$ cat input.txt | sort -k4 -k1,1rn | uniq -f3

これは作る:

34 20 15 cheese
13 -3 14 tomato
-3 -3 -3 potato

しかし、4番目の列のデータを統一し、同じ4番目の列のすべてのレコードの最大値を維持したいと思います。似ている:

34 23 34 cheese
13 6 20 tomato
-3 -3 -3 potato

これを達成するための迅速な方法はありますか?

ベストアンサー1

AWKを使用:

#!/usr/bin/awk -f
!keys[$4] { keys[$4] = 1; for (i = 1; i < 4; i++) max[$4][i] = $i }
{ for (i = 1; i < 4; i++) {
    if (max[$4][i] < $i) max[$4][i] = $i
} }
END { for (key in max) print max[key][1], max[key][2], max[key][3], key }

これは、4番目の列の各キーの3つの最大値を追跡します。

注意すべき点は、キーの順序が維持されないことです。

おすすめ記事