列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
答え1
これは働きます:
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
最初のフィールドにいます。
- -n は数値ソートを指定します。
- -r は逆順ソート結果を指定します。
- -k1,1 は、ソートする最初のフィールドを指定します。
これで、ソート後に出力をパイプして最初の結果を得ました。これにより、結果の列1に数値的に最も高い値が与えられます。
これで、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
答え2
これを行うために使用できますAWK
。
$ awk '{if(max<$1){max=$1;line=$2}}END{print line}' file
/opt/oracle/app/oracle/product/12.1.0
ここで、各行の最初の列はmax
変数(初期ゼロ)と比較されます。 1 番目の列の値が 2 番目の列の値より大きい場合、2 番目の列は変数に格納され、max
ファイルline
の各行に対して続きます。
ファイルの最後でEND
ルールを実行してline
変数を印刷します。
答え3
awk '$1 > max { max = $1; output = $2 } END { print output }' version.log
答え4
sort
コマンドを使用してソートするだけです。
sort -r version.log | head -n1 | awk '{print $2}'
出力:
/opt/oracle/app/oracle/product/12.1.0