列3の最大値を見つけ、列1と2の値のみを出力します。

列3の最大値を見つけ、列1と2の値のみを出力します。

Unix では、Column3 の最大値を見つけて、Column2 と Column1 (Column3 ではない) の対応する値を新しいファイルに出力するコマンドを探しています。

 Column1     Column2     Column3
   A          1          25
   B          2          6
   C          3          2
   D          4          16
   E          5          10

Unix コマンドは何を使用すればよいでしょうか? grep、awk、datamash のどれを使用すればよいでしょうか?

答え1

を使用しますawk。データがサンプル データとまったく同じ形式になっていると仮定すると、次のコードで目的の出力が生成されます。

awk -v MAX=0 '{ if(NR>1 && $3>MAX){WANT1=$1; WANT2=$2; MAX=$3}} END{print WANT1, WANT2}' infile > outfile

答え2

データが指定したとおりにフォーマットされており (特に 3 番目の列では数字がすべて左揃え)、このデータがcatファイルによって提供されていると仮定すると、次のコマンドを試すことができます。

*input generating command* | sort -nrk3 | awk '{print $1 " " $2}' > output_file

データが他のコマンドまたはソースから提供されている場合は、catそのコマンドに変更してください。詳細については、この郵便受け基本的にはあなたのニーズに合わせて調整しただけです。

編集:

sortソートは常に空白を区切り文字として扱うため、列 3 の文字 1 から開始するように指示する必要がないため、上記のコマンドを少し変更しましたsort。ユーザーが指摘したように、入力ファイルを直接指定することもできます。ヘッダーもデータの一部である場合は、上記のコマンドを次のように変更します。

*input generating command* | sort -nrk3 | awk '{if (NR>1) print $1 " " $2}' > output_file

答え3

awk '{if(NF>2 && $3>M){M=$3;print $1,$2} }' file1 | tail -1 > file2

関連情報