我对第五列的最大值感兴趣。但是,我还希望能够将该行的第 6 个和第 9 个值捕获到数组中。我该怎么做呢?
下面的命令尝试仅获取第五列值。
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
如果您希望将它们存储在 shell 变量中,那么最简单的方法是将它们存储在 shell 数组中,例如,根据这些字段的值,这可能就是您所需要的:
$ 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 (或其他任何东西)将多个值返回到 shell 脚本,那么您必须在 awk 脚本中实际打印它们和使用将它们读入 shell 变量(或使用- 也称为read
shell 数组)。mapfile
readarray
顺便说一句,由于您使用的是 bash,请运行help read
或help mapfile
了解有关它们的详细信息。
例如以下用途read
和流程替代将值读入 shell 变量$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
所以我用更简单的东西进行了测试 - 这也表明该方法适用于任何在一行上输出 3 个值的程序或函数,用空格分隔:
$ read -r max5 max6 max9 < <(awk 'BEGIN{print 1,2,3}')
$ printf "%s\n" "$max5" "$max6" "$max9"
1
2
3