classifica apenas a primeira coluna e uniq

1

Eu tenho uma lista assim:

1,cat  
1,dog  
2,apple  
3,human

Eu gostaria de uma saída como esta:

1,cat,dog  
2,apple  
3,human  

Portanto, o valor 1 da coluna 1 contém o valor de gato e cachorro da coluna 2. Isso é possível?

    
por XY g 29.03.2015 / 05:41

2 respostas

5

Supondo que a primeira coluna esteja estritamente ordenada:

$ awk -F, '$1==last {printf ",%s",$2;next} NR>1{print""} {last=$1;printf "%s",$0} END{print""}' file
1,cat,dog
2,apple
3,human

Como alternativa, permitir as linhas de entrada em qualquer ordem (e as linhas de saída em nenhuma ordem garantida):

$ awk -F, '{a[$1]=a[$1]","$2} END{for (i in a)print i a[i]}' file
1,cat,dog
2,apple
3,human
    
por 29.03.2015 / 07:50
1

Em Perl:

$ perl -F',' -lane 'push @{$k{$F[0]}},@F[1..$#F]; 
                    END{$,=",";print $_,@{$k{$_}} for keys(%k)}' file 
2,apple
1,cat,dog
3,human

Ou, para saída classificada:

$ perl -F',' -lane 'push @{$k{$F[0]}},@F[1..$#F]; 
                    END{$,=",";print $_,@{$k{$_}} for sort keys(%k)}' file 
1,cat,dog
2,apple
3,human

Isso tem a vantagem de poder lidar com um número arbitrário de campos. Se todas as suas linhas tiverem apenas 2 campos, você pode simplificar para

perl -F',' -lane 'push @{$k{$F[0]}},$F[1]; 
                  END{$,=",";print $_,@{$k{$_}} for sort keys(%k)}' file 
    
por 29.03.2015 / 14:52