我的具体示例是查找第 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
这会处理文件两次:一次查找最大值,然后再次打印匹配的值。我正在权衡减少内存使用量以增加运行时间。