Como tornar os valores de uma coluna separados por vírgula?

2

Eu tenho um arquivo de entrada com colunas de valor único, conforme abaixo:

Arquivo de entrada:

B00000|1|def|b12  
B00001|1|xyz|
B00000|1||b11  
B00001|1|def|ab1  
B00001|2|ghi|bc2  
B00002|1|abc|ac1  
B00002|1|xyz|bc2  

Eu preciso delimitar os dados em terceira e quarta colunas em relação ao primeiro e ao segundo, de modo a obter a saída como:

Saída:

B00000|1|def|b11,b12  
B00001|1|def,xyz|ab1  
B00001|2|ghi|bc2  
B00002|1|abc,xyz|ac1,bc2  
    
por lunix 15.09.2016 / 19:20

2 respostas

4

#!/usr/bin/gawk -f
BEGIN          { OFS=FS="|"}

a[$1][$2][3]   { a[$1][$2][3] = a[$1][$2][3] "," $3;
                 a[$1][$2][4] = a[$1][$2][4] "," $4;
                 next }

               { a[$1][$2][3] = $3;
                 a[$1][$2][4] = $4   }

END            { for (b in a)
                    for(c in a[b]) print b,c,a[b][c][3],a[b][c][4] }

Por favor, veja @ dave_thompson_085 'comentário abaixo sobre uma versão correspondente para o awk (usando matrizes unidimensionais)

    
por 15.09.2016 / 19:48
1
$ cat ip.txt 
B00000|1|def|b12  
B00001|1|xyz|a11  
B00000|1|abc|b11  
B00001|1|def|ab1  
B00001|2|ghi|bc2  
B00002|1|abc|ac1  
B00002|1|xyz|bc2  

$ perl -ne '($k,$v1,$v2)=/([^|]+\|[^|]+\|)([^|]+)\|([^ ]*)/;
$h1{$k}.=$h1{$k}?",$v1":$v1; $h2{$k}.=$h2{$k}?",$v2":$v2;
END{ foreach (keys %h1){print "$_$h1{$_}|$h2{$_}\n"} }
' ip.txt 
B00001|2|ghi|bc2
B00002|1|abc,xyz|ac1,bc2
B00000|1|def,abc|b12,b11
B00001|1|xyz,def|a11,ab1
  • A linha de entrada é dividida em três partes, por ex: B00000|1| , def e b12 . O espaço em branco à direita na linha é ignorado
  • Em duas variáveis hash diferentes, com a mesma chave, os valores $v1 e $v2 são anexados. , é adicionado se o valor de hash da chave não estiver vazio
  • Depois que todas as linhas são processadas, a saída é impressa

Se a entrada e as chaves estiverem ordenadas:

$ sort ip.txt | perl -ne '($k,$v1,$v2)=/([^|]+\|[^|]+\|)([^|]+)\|([^ ]*)/;
$h1{$k}.=$h1{$k}?",$v1":$v1; $h2{$k}.=$h2{$k}?",$v2":$v2;
END{ foreach (sort keys %h1){print "$_$h1{$_}|$h2{$_}\n"} }'
B00000|1|abc,def|b11,b12
B00001|1|def,xyz|ab1,a11
B00001|2|ghi|bc2
B00002|1|abc,xyz|ac1,bc2
    
por 16.09.2016 / 06:26