仅打印具有最高值的行

仅打印具有最高值的行

我需要在 bash 脚本中处理如下文件:

输入.txt:

host1 53
host1 123
host2 0
host1 222
host3 1
host1 85
host1 25
host1 13
host3 8
host2 90

我只需要根据第 2 列中的最大值为每个主机获取一行结果:

输出.txt:

host1 222
host2 90
host3 8

有任何想法吗?

答案1

使用 GNUsort或兼容:

<input.txt sort -k2rn | sort -sbuk1,1 >output.txt

答案2

GNU 最短的一个datamash:

datamash -sW -g1 max 2 <file
  • -s- 分组前对输入进行排序
  • -W- 使用空格(一个或多个空格和/或制表符)作为字段分隔符
  • -g 1- 通过第一个字段进行分组
  • max 2- 数值运算以获得每组第二个字段的最大值

输出:

host1   222
host2   90
host3   8

答案3

这是 awk 的一行:

$ awk '{if (a[$1] == "" || $2 > a[$1]) a[$1] = $2} END { for (k in a) print k, a[k] }' < input.txt
host1 222
host2 90
host3 8

$1$2是该行的前两个字段,关联数组a[k]保存 key 的当前最大值k。通过针对空的测试a[$1],应该正确处理负数。

相关内容