Mesclar listas classificadas

5

Eu tenho alguns arquivos .txt (no mesmo diretório) que se parecem com isso:

   123 carrot
    50 apple
    13 tomato
     5 potato
     2 pear

e

   100 carrot
    10 apple
     3 tomato
     2 potato

Eu preciso mesclá-los em uma lista classificada. Então, se eu tivesse apenas duas listas acima, eu pegaria

   223 carrot
    60 apple
    16 tomato
     7 potato
     2 pear

Existe uma maneira fácil de fazer isso com comandos shell, ou devo começar a escrever código?

Obrigado!

    
por Oleg Kikin 10.12.2012 / 10:49

1 resposta

4

Onde está a linha entre "comandos shell" e "código"? Este exemplo talvez esteja além dessa linha, mas é apenas uma função de agregação rápida em awk que eu já escrevi para outro propósito (mais elaborado), então também posso postá-lo.

Supondo que os arquivos estejam localizados no diretório dir/ , awk poderá somar como tal:

awk '
    {fruits[$2]+=$1}
    END { for (fruit in fruits) {printf "%6s %s\n", fruits[fruit], fruit} }
' dir/* | sort -rn

Divisão:

  • Verifique todas as linhas em todos os arquivos e adicione o valor do primeiro campo ao valor existente do índice dessa fruta na matriz fruits (ou crie esse índice, se ele não existir).
  • Quando os arquivos tiverem sido percorridos, faça um loop pelos índices em fruits e imprima seu valor e seu nome no formato especificado.
  • A classificação da matriz em awk é possível, mas é muito mais fácil usar apenas sort . -rn classifica numericamente em ordem decrescente.
por 10.12.2012 / 14:05