使用 awk 命令比较不同行和多列中的值?

问题描述 投票:0回答:1

我有一个包含四列的文件:

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

提前非常感谢!

awk
1个回答
0
投票

您只在

$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。 (尽管要花一两个小时;这是很好的利用时间的方法。)

© www.soinside.com 2019 - 2024. All rights reserved.