使用 awk,如何找到列中的最大值,然后打印找到数据的行的不同字段?

使用 awk,如何找到列中的最大值,然后打印找到数据的行的不同字段?

我的具体示例是查找第 5 列中的最大值,然后查找与该值关联的第二个字段。例如:

1  text1  1   1   5
2  text2  2   2   10 
3  text3  3   3   15
4  text4  4   4   50
5  text5  5   5   25

这是我的脚本。它以查找最大值的函数开始,然后尝试打印找到最大值的同一行的第二个字段的数据。

function max(val1,val2){
        if (val1 > val2)
                return val1
        else
                return val2
}

BEGIN {largest = 0}

{largest = max(largest,$5 + 0)}
$5 ~ largest {print $2}

END {}

这最终打印出来

text1
text2
text3
text4

因为每次找到新的最大值时它都会打印出第二个字段。我试图找到一种方法,让它只打印出最后找到的最大值,因此它只打印“text4”。我尝试放入"$5 ~ largest {print $2}"结束块,但它给出了语法错误。

答案1

所有 awk 脚本都可以简化为:

awk 'max<$5 || NR==1{ max=$5; data=$2 } END{ print data }' infile

或者在第五列中“保留第二列的所有行具有相同的最大值” :

awk 'max<$5 || NR==1 { max=$5; data=$2; next }
     max==$5{ data= data ORS $2 }
END{ print data }' infile

关于您自己编写的脚本,您需要处理输入文件两次,第一次处理找到最大值,第二次处理打印具有该最大值的行的第二列,如下所示:

awk 'function max(val1, val2){
        if (val1 > val2)
                return val1
        else
                return val2
}

BEGIN { largest = 0 }

NR==FNR{ largest = max(largest,$5 + 0); next }
$5==largest { print $2 }' infile infile

答案2

我将你的问题解释为

找到第 5 列中的最大值,然后打印第 2 列中具有该最大值的所有值。

awk '
    NR == FNR {
        if (FNR == 1 || $5 > max) max = $5
        next
    }
    $5 == max {print $2}
' file file

这会处理文件两次:一次查找最大值,然后再次打印匹配的值。我正在权衡减少内存使用量以增加运行时间。

相关内容