计算具有约束的重复行

And*_*rej 6 bash awk perl

我有以下文件:

A B 1990
A C 2001
A C 2013
A B 2001
B C 2013
A D 2001
A D 2014
Run Code Online (Sandbox Code Playgroud)

我需要计算重复对(在第一列和第二列中),并为每个这样的对分配第三列中的最低值。对于我的玩具文件,输出应该是:

A B 2 1990
A C 2 2001
A D 2 2001
B C 1 2013
Run Code Online (Sandbox Code Playgroud)

例如,pairA B出现两次,第一次为 1990,第二次为 2001,因为 1990 < 2001 我们将 1990 分配给这个计数。

我想知道如何使用 Linux 工具(Bash、AWK、Perl)来做到这一点。任何想法/指针将不胜感激。

cuo*_*glm 2

尝试这个:

$ awk -v SUBSEP=" " '
    {a[$1,$2]++;b[$1,$2] = (b[$1,$2] && $3 > b[$1,$2]) ? b[$1,$2] : $3}
    END {
        for (i in a) {
            print i,a[i],b[i];
        }
    }
' file
A B 2 1990
A C 2 2001
A D 2 2001
B C 1 2013
Run Code Online (Sandbox Code Playgroud)

如果您可以更改字段的顺序,甚至会更短:

$ sort -n -k1 -k2 -k3 file | uniq -c -w 3
      2 A B 1990
      2 A C 2001
      2 A D 2001
      1 B C 2013
Run Code Online (Sandbox Code Playgroud)