我已经对文本文件和简单的 awk 进行了排序,得到第一行(平均最大值)
例如
Key Column1 Column2 Column3 ..... MaxValue
Test1 500 400 200 500
Test1 499 400 200 500
Test1 499 399 200 499
Test1 498 100 100 498
Test2 600 200 150 600
Test2 600 199 150 600
Test2 599 199 100 599
我可以使用下面的 shell 脚本来获取动态列
MaxValue=`awk -F'\t' -v OFS="MaxValue" 'NR==1 {for (i=1; i<=NF; i++) if ($i==OFS) {print i} }'
我有简单的代码来获取第一行(平均最大值)
like awk '!a[$1]++'
然后结果如下,
Key Column1 Column2 Column3 ..... MaxValue
Test1 500 400 200 500
Test2 600 200 150 600
只需按 Key 获取最高值即可。 但我想检查另一个动态列,如果只打印相同的值。 所以结果如下,
Key Column1 Column2 Column3 ..... MaxValue
Test1 500 400 200 500
Test1 499 400 200 500
Test2 600 200 150 600
Test2 600 199 150 600
有人知道如何使用 awk 吗? 谢谢!
最佳答案
你必须遍历文件两次:一次收集最大值,一次找到匹配它们的行:
awk '
NR == FNR && ( !($1 in max) || max[$1] < $NF ) {max[$1] = $NF}
NR != FNR && $NF == max[$1]
' file file
如果您想提供包含最大值的列的名称:
awk -v colname="Column2" '
NR == 1 {for (i=2; i<=NF; i++) if ($i == colname) maxcol = i}
NR == FNR && ( !($1 in max) || max[$1] < $maxcol ) {max[$1] = $maxcol}
NR != FNR && $maxcol == max[$1]
' file file
您可能想要添加一些验证,以确保 maxcol 变量实际设置为一个数字。
并加入@tommy的建议
awk -v colname="MaxValue" '
NR == 1 {
for (i=2; i<=NF; i++) if ($i == colname) maxcol = i
print
next
}
( !($1 in max) || max[$1] < $maxcol ) {
max[$1] = $maxcol
n[$1] = 0
delete lines[$1]
}
max[$1] == $maxcol {lines[$1][n[$1]++] = $0}
END { for (key in lines) for (i=0; i<n[key]; i++) print lines[key][i] }
' file
这个需要 GNU awk 来处理数组的数组。
关于linux - 排序文件仅获取行最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29831320/