Remove campos duplicados em uma determinada coluna (após a verificação de ID)

3

Gostaria de remover de uma dada coluna ($ 2 no exemplo) os campos duplicados (separados por vírgula), mas apenas se a coluna de ID ($ 1 no exemplo) for a mesma.

Entrada:

A    1,2,3,4
A    8,9,10,11
A    2,3,4,11,12
B    4,5,6,7
B    6,8,9,10

Resultado esperado:

A    1,2,3,4
A    8,9,10,11
A    12
B    4,5,6,7
B    8,9,10
    
por dovah 21.08.2014 / 11:18

2 respostas

7

Isso é bastante fácil em awk usando uma matriz , split , e um regular loop :

{
    split($2, elements, ",")
    out = ""
    for (i in elements) {
        el = elements[i]
        key = $1 " " el
        if (!(key in used)) {
            out = out el ","
        }
        used[key] = 1
    }
    sub(/,$/, "", out)
    $2 = out
}
1

Para cada linha, dividimos a segunda coluna por vírgulas e salvamos os bits em uma matriz elements . Em seguida, criamos o novo valor para essa coluna com um loop, verificando se já vimos o valor antes ou não.

Estamos mantendo o conjunto de valores que já vimos na matriz (associativa) used . Construímos uma string key contendo o valor da primeira coluna e o valor da segunda que estamos vendo no momento. Se key estiver em used , vimos este antes para este ID e não o colocaremos na saída; caso contrário, é novo e concatenamos o valor para out . Para não usá-lo novamente, armazenamos key (que será algo como " A 3 ") em nosso conjunto de elementos vistos.

Finalmente, colocamos a lista construída de volta na segunda coluna. Esta é essencialmente a abordagem que você toma em qualquer outro idioma.

Coloque o código acima em um arquivo e execute-o com awk -f , ou cite tudo como um argumento na linha de comando.

    
por 21.08.2014 / 11:33
3
perl -lpe 's/(\S+)\s+\K\S+/join ",", grep {!$seen{$1}->{$_}++} split ",", $&/e'
    
por 21.08.2014 / 11:27