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 块,但它给出了语法错误。
您所有的 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)