Suma por cadenas comunes en diferentes archivos

Suma por cadenas comunes en diferentes archivos

Tengo un archivo file1con la cantidad de veces que aparece un usuario en los archivos, algo como esto:

4 userC
2 userA
1 userB

y tengo otro archivo file2con usuarios y otra información como:

userC, degree2
userA, degree1
userB, degree2

y quiero un resultado donde muestre la cantidad de veces que aparece el usuario, para cada grado:

5 degree2
2 degree1

Respuesta1

Puro awk:

$ 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

O puedes ponerlo en un 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];
    }
}

Primero establezca el separador de campo en coma y espacio (es decir, el BEGINbloque o la -Fopción de línea de comando).

Luego, al analizar el primer archivo (el FNR == NRmodismo), coloque el número de conexiones para un usuario en una matriz indexada por nombre de usuario. Al analizar los siguientes archivos, agregue la cantidad de conexiones para cada usuario en la matriz indexada por grupo de usuarios.

Finalmente (el ENDbloque) escanea toda la matriz e imprime los pares clave-valor.

información relacionada