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 file
。bash 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
)。mapfile
readarray
ところで、あなたは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