AWK:最大列値が発生する行を取得します。

AWK:最大列値が発生する行を取得します。

5番目の列の最大値に興味があります。しかし、行の6番目と9番目の値を配列としてキャプチャすることもできます。どうすればいいですか?

以下のコマンドは、5番目の列値のみを取得しようとします。

myVar=$(bash myScript.sh | awk -v max=0 '{if($5>max){max=$5;max6=$6;max9=$9}}END{print $5}')

編集:print $ 5は列5の最大値を印刷します。

ありがとうございます。

答え1

以下のような入力ファイルが与えられた場合(値が正であるか負であるかは重要ではありませんが、人々はしばしばこれが起こるという事実を忘れ、少なくとも1つの値が次より大きいと仮定するスクリプトを書くので、すべての負の数を使用します。これは重要なテストです。0、初期テストではうまく機能しましたが、実際の値が与えられてから6ヶ月後に現場で奇妙に失敗しました。

$ cat file
a b c d  -5 foo e f bar
a b c d  -3 is e f stuff
a b c d -17 this e f here

5番目、6番目、9番目の値を印刷する方法は次のとおりです(明らかに持っていない値を使用して)cat filebash myScript.sh

$ cat file | awk '(NR==1) || ($5>m[5]){ split($0,m) } END{ print m[5], m[6], m[9] }'
-3 is stuff

これをシェル変数に保存する場合は、最も簡単な方法はシェル配列に保存することです。たとえば、これらのフィールドの値によっては、これが必要な場合があります。

$ arr=( $(cat file | awk '(NR==1) || ($5>m[5]){ split($0,m) } END{ print m[5], m[6], m[9] }') )

$ declare -p arr
declare -a arr=([0]="-3" [1]="is" [2]="stuff")

答え2

awk(または他のもの)がシェルスクリプトに複数の値を返すようにするには、実際にはawkスクリプトからその値を印刷する必要があります。そしてこれをシェル変数として読み込むために使用します(またはシェル配列とも呼ばれますread)。mapfilereadarray

ところで、あなたはbashを使っているので、bashを実行するhelp readか、help mapfileそれについてもっと学びましょう。

たとえば、次のread用途プロセスの交換値をシェル変数として読み取り、次の操作を行います$max5$max6$max9

#!/bin/bash

read -r max5 max6 max9 < <(bash myScript.sh |
  awk '$5 > max5 { max5=$5; max6=$6; max9=$9 }
       END { print max5, max6, max9 }' )

echo "max5 = $max5"
echo "max6 = $max6"
echo "max9 = $max9"

ところで、私はあなたのものがないので、myScript.shより簡単なものでテストしました。また、方法が動作することを示しています。どのスペースで区切って1行に3つの値を出力するプログラムまたは関数:

$ read -r max5 max6 max9 < <(awk 'BEGIN{print 1,2,3}')
$ printf "%s\n" "$max5" "$max6" "$max9"
1
2
3

関連情報