Contar linhas duplicadas com restrição

6

Eu tenho o seguinte arquivo:

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

Eu preciso contar pares duplicados (na 1ª e na 2ª coluna) e para cada par atribuir o menor valor da 3ª coluna. Para o meu arquivo de brinquedo, a saída deve ser:

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

Por exemplo, par A B ocorre duas vezes, primeira vez com valor 1990 e segunda vez com valor 2001, porque 1990 < 2001, atribuímos 1990 a essa contagem.

Gostaria de saber como fazer isso com as ferramentas do Linux (Bash, AWK, Perl). Quaisquer idéias / ponteiros seriam muito apreciados.

    
por Andrej 16.07.2014 / 18:57

1 resposta

2

Tente isto:

$ 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

Ainda mais curto, se você puder alterar a ordem do campo:

$ 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
    
por 16.07.2014 / 19:03

Tags