異なる最初の列に基づいてすべての列の最大値を見つける

異なる最初の列に基づいてすべての列の最大値を見つける

私はUbuntuを使用しており、次のような入力ファイルがあります。

ifile.dat
1   10  15
3   34  20
1   4   22
3   32  33
5   3   46
2   2   98
4   20  100
3   13  23
4   50  65
1   40  76
2   20  22

どうやってこれを達成できますか?

ofile.dat
1   40  76
2   20  98
3   34  33
4   50  100
5   3   46

私の言葉は、最初の列を比較して各列の最大値を取得することです。ありがとうございます。

私が試したことは次のとおりです(13列のサンプルファイルから)。しかし、最も高い価値はそれほど現れません。

cat input.txt | sort -k1,1 -k2,2nr -k3,3nr -k4,4nr -k5,5nr -k6,6nr -k7,7nr -k8,8nr -k9,9nr -k10,10nr -nrk11,11 -nrk12,12 -nrk13,13 | sort -k1,1 -u 

動作しません。役に立つ人が以下でこの問題を解決するのを手伝ってください。しかし、MacやUbuntuのgawkでは実行できず、以下のエラーが表示されます。

awk 'BEGIN{PROCINFO["sorted_in"] = "@val_num_asc"} {for(i=2;i<=NF;++i) if (a[$1][i]<$i){a[$1][i]=$i}} END{n=asorti(a, asorted); for(col1 in asorted){print col1, a[col1][2], a[col1][3]}}' input.txt 

エラーは次のとおりです。

awk: syntax error at source line 1
 context is
    BEGIN{PROCINFO["sorted_in"] = "@val_num_asc"} {for(i=2;i<=NF;++i) if >>>  (a[$1][ <<< 
awk: illegal statement at source line 1
awk: illegal statement at source line 1

BEGINステートメントを削除してforループを試してみましたが、運がありませんでした。ありがとうございます。

PS:stackoverflowからこの回答を得ました。ここがUnix / Linuxフォーラムであるため、ここに記事を投稿することになりました。

ベストアンサー1

GNUデータの混合次のような場合は大丈夫です。

$ datamash -sW groupby 1 max 2,3 < ifile.dat 
1   40  76
2   20  98
3   34  33
4   50  100
5   3   46

より多くの列を処理するには、次のように指定できます。範囲例えば

datamash -sW groupby 1 max 2-13 < ifile.dat 

おすすめ記事