制約付き重複行の計算

制約付き重複行の計算

次のファイルがあります。

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

最初の列と2番目の列の冗長ペアを計算し、各ペアに3番目の列の最も低い値を割り当てる必要があります。私のおもちゃファイルの場合、出力は次のようになります。

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

たとえば、ペアはA B2回表示されます。最初は値が1990で、2番目は値が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

おすすめ記事