2015-03-25 31 views
1

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

因此,考虑到输入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 

这是此以前,相关话题的offshot:awk: keep records with the highest value, comparing those that share other fields

我已经有了一个解决方案(见下文),但欢迎提供想法!

回答

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),请使用此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 
+2

这似乎是自然的方式。由于问题标记为“gawk”,请让我留下一个[link](https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html),其中详细说明了如何轻松控制用GNU awk输出。可能是相关的。 – Wintermute 2015-03-25 10:48:51

+0

你更简单,更好,谢谢!我利用“拆分字符串”功能来保留未使用的字段,如果您定义了两个数组,则这不是必需的。 – XGrau 2015-03-25 11:14:51

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 

第一支架块指示哪个字段定义在其内要比较的其他字段的类别(第一和第三字段,在这种情况下)。

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

想法表示欢迎!

相关问题