Agrupar palavras com base no valor da primeira coluna

1

Eu quero agrupar todo o conteúdo do arquivo com base no valor da primeira coluna. Seria melhor se a saída estivesse em uma forma ordenada.

Entrada:

1 foo
2 bar
1 foobar
2 barbar
3 apple
4 banana
3 mango
5 orange

Resultado esperado:

1 foo, foobar
2 bar, barbar
3 apple, mango
4 banana
5 orange
    
por Avinash Raj 20.10.2014 / 16:21

2 respostas

4

Se bem entendi, você está procurando

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

Não há motivo para dividir explicitamente a linha, a -a flag já faz isso para você. Ele dividirá cada linha de entrada na matriz @F . Então, aqui nós criamos o %k hash cujas chaves são os primeiros campos e cujos valores são as listas correspondentes dos 2º campos. Em seguida, no final, classificamos as chaves de hash, definimos o separador de lista ( $" ) como ,[space] e imprimimos cada chave e sua lista de valores correspondente.

    
por 20.10.2014 / 16:36
3

Outro perl :

$ perl -anle '
    push @{$h{$F[0]}}, $F[1];
    END {
        for (sort {$a <=> $b} keys %h) {
            print "$_ ", join(", ", @{$h{$_}});
        }
    }
' file
1 foo, foobar
2 bar, barbar
3 apple, mango
4 banana
5 orange

Explicação

  • Criamos um hash $h , que tem as chaves com o valor $F[0] . O valor de cada hash é uma referência de matriz. Ao processar cada linha, adicionamos valor do segundo campo $F[1] à referência do array push @{$h{$F[0]}}, $F[1] .

  • Após processar todas as linhas, classificamos as chaves de $h ( sort {$a <=> $b} keys %h ), associamos cada referência de matriz a uma string ( join(", ", @{$h{$_}}) ), imprimimos cada chave correspondente à string de associação.

por 20.10.2014 / 18:39

Tags