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


19

列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

回答:


23

これは動作するはずです:

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

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

編集

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

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

私はsort最初の分野で活動しています。

  • -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

awk maxは、文字列フィールドを数値的に比較しません。それがなぜあなたが第二のアプローチを与えたのですか?
-Sajuuk

7

あなたはそれを行うことができます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変数を出力します。


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

3

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


1
これは機能するはずですが、タスクが最大値を見つけるためにソートするのはやり過ぎなので、非効率的です。
jw013 14年

2

単純にsortコマンドを使用してソートできます

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

出力:

/opt/oracle/app/oracle/product/12.1.0

2番目の値を出力する場合は、このcat version.logのみを試してください。sort -r | ヘッド-n1 | awk -F "" '{Print $ 2}'
セキュリティビースト14年

端末のスクリーンショットを投稿しないでください。代わりにテキストを貼り付けてください。また、は必要ありませんcat。sortは入力ファイルを直接取得できます。
テルドン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.