Somando por strings comuns em arquivos diferentes

1

Eu tenho um arquivo file1 com a quantidade de vezes que um usuário aparece nos arquivos, algo assim:

4 userC
2 userA
1 userB

e eu tenho outro arquivo file2 com usuários e outras informações como:

userC, degree2
userA, degree1
userB, degree2

e eu quero uma saída onde mostre a quantidade de vezes que o usuário aparece, para cada grau:

5 degree2
2 degree1
    
por GuyWhoNeedsHelp 11.10.2014 / 19:12

1 resposta

4

% puroawk:

$ awk -F'[, ]' 'NR==FNR{n[$2]=$1;next}{m[$3]+=n[$1]}
    END{for(i in m){print i " " m[i]}}' \
    file1 file2
degree1 2
degree2 5

Ou você pode colocá-lo em um script como este:

#!/usr/bin/awk -f 
BEGIN {
    FS="[, ]"
}
{
    if (NR == FNR) {
        n[$2] = $1;
        next;
    } else {
        m[$3] += n[$1];
    }
}
END {
    for (i in m) {
        print i " " m[i];
    }
}

Primeiro, defina o separador de campos como vírgula e espaço (ou seja, a opção BEGIN ou -F da linha de comando.

Em seguida, ao analisar o primeiro arquivo (o FNR == NR idiom), coloque o número de conexões de um usuário em matriz indexada por nome de usuário. Ao analisar o (s) arquivo (s) a seguir, adicione o número de conexões para cada usuário no array indexado pelo grupo de usuários.

Finalmente (o bloco END ) verifica a matriz inteira e imprime a chave, pares de valores.

    
por 11.10.2014 / 21:01