Concatene vários campos separadamente com base em uma coluna (chave)

1

Eu tenho dados de teste separados por tabulações assim:

    A     1     2
    B     3     4
    B     5     6
    C     7     8

Eu quero concatenar (agregar) ambas as colunas # 2 e # 3 com base em valores duplicados na coluna 1, assim:

    A     1     2
    B     3;5   4;6
    C     7     8

Agora, o código de trabalho que desenvolvi com base em soluções aqui ( Mesclando várias linhas com base na coluna 1 ) não está mesclando valores de várias colunas separadamente:

   <test.txt awk -F"\t" '{OFS="\t"} {a[$1]=($1 in a)?a[$1]";"$2FS$3:$1FS$2FS$3} END{for(i in a){print a[i]}}'
    A     1     2
    B     3     4;5 6
    C     7     8

Eu realmente aprecio se alguém puder ajudar a apontar o erro no meu código. Tentei várias variações, mas não consegui formatá-lo corretamente.

    
por psaima 20.06.2015 / 00:45

2 respostas

3

Use variáveis separadas para conter os valores concatenados de cada coluna.

awk -F'\t' -v OFS='\t' '{
    if ($1 in a) {
        a[$1] = a[$1]";"$2;
        b[$1] = b[$1]";"$3;
    } else {
        a[$1] = $2;
        b[$1] = $3;
    }
}
END { for (i in a) print i, a[i], b[i] }' < test.txt
    
por 20.06.2015 / 01:12
0

Pouco tarde, mas aqui está uma alternativa usando uma sub matriz sintetizada:

awk -v OFS='\t' '{
  if ($1 in arr) {
    split(arr[$1], subArr);
    arr[$1] = subArr[1] ";" $2 OFS subArr[2] ";" $3;
  }
  else {
    arr[$1] = $2 OFS $3
  } }
  END {
    for (i in arr) print i,arr[i];
  }'
    
por 20.06.2015 / 01:25