AWK:获取列值最大值出现的行

AWK:获取列值最大值出现的行

我对第五列的最大值感兴趣。但是,我还希望能够将该行的第 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 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

如果您希望将它们存储在 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 变量(或使用- 也称为readshell 数组)。mapfilereadarray

顺便说一句,由于您使用的是 bash,请运行help readhelp 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

相关内容