我已经对文本文件和简单的awk进行了排序,获得第一行(平均最大值)
Forexample
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的好主意吗? 谢谢!
答案 0 :(得分:3)
你必须迭代文件两次:一次收集最大值,一次找到匹配它们的行:
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。