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

Rya*_*yan 4 awk text-processing

我的具体示例是在第 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
Run Code Online (Sandbox Code Playgroud)

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

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 {}
Run Code Online (Sandbox Code Playgroud)

这最终打印出来

text1
text2
text3
text4
Run Code Online (Sandbox Code Playgroud)

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

αғs*_*нιη 8

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

awk 'max<$5 || NR==1{ max=$5; data=$2 } END{ print data }' infile
Run Code Online (Sandbox Code Playgroud)

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

awk 'max<$5 || NR==1 { max=$5; data=$2; next }
     max==$5{ data= data ORS $2 }
END{ print data }' infile
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)