列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
これはうまくいくはずです:
awk -v max=0 '{if($1>max){want=$2; max=$1}}END{print want} ' version.log
-v max=0
は、変数max
を0
に設定します。次に、各行で、最初のフィールドがmax
の現在の値と比較されます。それより大きい場合、max
は最初のフィールドの値に設定され、want
は現在の行に設定されます。プログラムがファイル全体を処理すると、want
の現在の値が出力されます。
編集
私は以前にawk
ソリューションをテストしなかったので、それを提供したのは本当に悪いことでした。とにかく、回答の編集されたバージョンは機能するはずです(修正してくれたterdonに感謝)。以下もテストしました。
sort -nrk1,1 filename | head -1 | cut -d ' ' -f3
私は最初のフィールドでsort
ingしており、
ここで、並べ替えの後、出力をパイプ処理し、最初の結果を取得します。これにより、結果の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
あなたは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
変数が出力されます。
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log
sort -k1 -n filename | tail -1 | awk '{print $2}'
単に、sort
コマンドを使用して並べ替えることができます
sort -r version.log | head -n1 | awk '{print $2}'
出力:
/opt/Oracle/app/Oracle/product/12.1.0