计算有约束的重复行

计算有约束的重复行

我有以下文件:

A B 1990
A C 2001
A C 2013
A B 2001
B C 2013
A D 2001
A D 2014

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

A B 2 1990
A C 2 2001
A D 2 2001
B C 1 2013

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

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

答案1

尝试这个:

$ 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

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

$ 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

相关内容