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.