私は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