使用 Linux 查找第一列中每个不同值的第二列中的最大值

Kay*_*Kay 2 unix linux bash awk

我有两列如下

ifile.dat
1   10
3   34
1   4
3   32
5   3
2   2
4   20
3   13
4   50
1   40
2   20
Run Code Online (Sandbox Code Playgroud)

我寻找的是在第二列中找到第一列中每个 1,2,3,4,5 的最大值。

ofile.dat
1   40 
2   20
3   34
4   50
5   3
Run Code Online (Sandbox Code Playgroud)

我发现有人使用其他程序完成了此操作,例如根据 A 列的每个不同值获取 B 列的最大值

Pan*_*tes 5

awk似乎是这项任务的主要候选人。只需遍历输入文件并保留一个由第一列值索引的数组,如果第二列的值大于当前存储的值,则存储第二列的值。在遍历结束时迭代数组以打印索引和相应的值

awk '{
    if (a[$1] < $2) {
        a[$1]=$2
    }
} END {
    for (i in a) {
        print i, a[i]
    }
}' ifile.dat
Run Code Online (Sandbox Code Playgroud)

现在结果不会在第一列上按数字排序,但如果需要的话应该很容易修复

  • 请注意,最大值为负数的第一组将会失败。在测试当前值是否更大之前,您应该查看是否设置了“a[$1]”。在 `if (a[$1] &lt; $2)` 之前添加 `if (a[$1] == "") a[$1] = $2;`。 (2认同)