awk:保留共享字段的最高值的记录,同时忽略其他字段

时间:2015-03-25 10:32:28

标签: bash awk gawk

想象一下,您希望在表的给定字段中保留具有最高值的记录,只需在另一个字段定义的类别内进行比较(并忽略其他字段的内容)。

所以,给定输入nye.txt:

X A 10.00
X A 1.50
X B 0.01
X B 4.00
Y C 1.00
Y C 2.43

你期望这个输出:

X A 10.00
Y C 2.43

这是之前相关主题的一个结果:awk: keep records with the highest value, comparing those that share other fields

我已经有了一个解决方案(见下文),但欢迎提出建议!

2 个答案:

答案 0 :(得分:4)

使用 awk

这样的话
awk '$3>=a[$1]{a[$1]=$3; b[$1]=$0} END{for(i in a)print b[i]}' File

对于每个1st column value(X,Y等..),如果3rd column value大于或等于先前存储的大值(即a[$i];最初它将是0默认情况下为{1}},使用此3rd column value更新[$ i]。同时将整行保存在数组b中。在END块内,打印结果。

<强>输出:

AMD$ awk '$3>a[$1]{a[$1]=$3; b[$1]=$0} END{for(i in a)print b[i]}' File
X A 10.00
Y C 2.43

答案 1 :(得分:0)

我的解决方案是:

awk '{ k=$1 } { split(a[k],b," ") } $3>b[2] { a[k]=$2" "$3 } END { for (i in a) print i,a[i] }' nye.txt

第一个括号区块指示哪个字段定义了您要在其中比较另一个字段的类别(在本例中为第1个和第3个字段)。

(基于https://stackoverflow.com/a/29239235/3298298

欢迎提示!