web-dev-qa-db-ja.com

列1の最大値を見つけて、ファイルの列2からそれぞれのレコードを出力します

列1から最大値を見つけ、n個のレコードを含むファイルからそれぞれのパスの場所をエコーする方法。

$ cat version.log
112030  /opt/Oracle/app/Oracle/product/11.2.0
121010  /opt/Oracle/app/Oracle/product/12.1.0

期待される出力:

/opt/Oracle/app/Oracle/product/12.1.0
24
ABUL KASHIM

これはうまくいくはずです:

awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log

-v max=0は、変数max0に設定します。次に、各行で、最初のフィールドがmaxの現在の値と比較されます。それより大きい場合、maxは最初のフィールドの値に設定され、wantは現在の行に設定されます。プログラムがファイル全体を処理すると、wantの現在の値が出力されます。

編集

私は以前にawkソリューションをテストしなかったので、それを提供したのは本当に悪いことでした。とにかく、回答の編集されたバージョンは機能するはずです(修正してくれたterdonに感謝)。以下もテストしました。

sort -nrk1,1 filename | head -1 | cut -d ' ' -f3

私は最初のフィールドでsortingしており、

  • -nは数値ソートを指定します。
  • -rは、ソート結果を逆にします。
  • -k1,1は、ソー​​トを行う最初のフィールドを指定します。

ここで、並べ替えの後、出力をパイプ処理し、最初の結果を取得します。これにより、結果のcolumn1の数値が最も高い値が得られます。

次に、区切り文字をスペースとして指定してcutにパイプし、目的の出力である-f3を出力します。

テスト

cat filename
112030   /opt/Oracle/app/Oracle/product/11.2.0
121010   /opt/Oracle/app/Oracle/product/12.1.0
2312     /hello/some/other/path
3423232  /this/is/really/big/number
342      /ok/not/the/maximum/number
9999899  /Max/number
9767     /average/number

ここで、上記の入力に対して上記のコマンドを実行すると、次のような出力が得られます。

/Max/number
26
Ramesh

あなたはAWKでそれを行うことができます。

$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file 
/opt/Oracle/app/Oracle/product/12.1.0

ここでは、各行の最初の列が変数max(最初は0)と比較されます。最初の列の値がmaxより大きい場合、2番目の列は変数lineに格納され、これはファイルのすべての行で継続されます。

ファイルの最後でENDルールが実行され、line変数が出力されます。

7
Kannan Mohan
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log
4
jw013

sort -k1 -n filename | tail -1 | awk '{print $2}'

3
Mandar Shinde

単に、sortコマンドを使用して並べ替えることができます

sort -r version.log | head -n1 | awk '{print $2}'

出力:

/opt/Oracle/app/Oracle/product/12.1.0
2
Security Beast