我需要在 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]
,应该正确处理负数。