我有一个包含四列的文件:
text1 a1 a2 5
text2 b2 b8 10
text3 b9 b4 15
text3 b9 b4 25
text3 b9 b4 20
text4 h1 g8 50
text4 g1 k5 70
text4 g1 k5 80
text4 g1 k5 50
text5 y5 p3 25
我想要以下结果:
text1 a1 a2 5
text2 b2 b8 10
text3 b9 b4 25
text4 h1 g8 50
text4 g1 k5 80
text5 y5 p3 25
从匹配的行中删除重复值: 第一、二、三列相同,第四列取最高值。
我尝试如下:
awk '!x[$1]++' 文件.txt
提前非常感谢!
您只在
$1
上建立索引,但您的问题要求键为 $1
..$3
,显然您的尝试没有采取任何措施来选择最大值而不是该键的第一个值。
如果某个键的值始终相邻,您可以收集它们直到到达下一个键,然后使用最大值打印该值。
awk 'k != $1 "_" $2 "_" $3 {
if(NR > 1) print v;
k=$1 "_" $2 "_" $3; s = $4; v = $0; next }
$4 > s { s = $4; v = $0 }
END { print v }' file.txt
如果不能保证相邻单元格,对文件进行排序并通过管道传输到 Awk 可能比编写更好的脚本更容易,特别是如果您还没有学过任何 Awk。 (尽管要花一两个小时;这是很好的利用时间的方法。)