Obtenga una lista de nombres de archivo y compárelos con un archivo csv mientras agrega la segunda y la tercera columna de la misma primera columna

Aug 15 2020

Tengo un archivo csv que se parece a esto:

user1,400,300
user2,250,250
user3,400,300
user1,400,300
user4,400,300
user2,250,250

y un directorio que tiene un archivo vacío con el nombre del usuario

$ ls /dir/*
/dir/user1
/dir/user2

Quiero buscar el archivo y guardar su nombre en una matriz, luego buscar ese nombre a través del registro csv, agregar toda la segunda y tercera columna de ese nombre, para todas las filas, y también muestra si el valor del usuario excede ex: 400

Resultados de ejemplo:

user1,1400
user1 has exceed 400
user2,1000
user2 has exceed 400

Realmente agradecería un poco de ayuda. Actualmente estoy intentando con esto, pero no hay resultados:

shopt -s nullglob
cd /dir/
ARRAY=(*)

for ((i=0; i<${#ARRAY[@]}; i++)); do
    name=${ARRAY[i]} awk ' BEGIN{FS=OFS=","} {$name += (($2+$3))} 
    END{for (j in a) printf "%s | %0.2f\n", j, a[j]}
    ' /dir.csv
done
cd

¿O tal vez hay un método más simple en el que no es necesario guardar el nombre del archivo en una matriz?

Respuestas

Quasímodo Aug 15 2020 at 20:13

yo sugiero

for f in dir/*; do awk -F ',' '$1==f{s+=$2+$3}END{print f","s;if(s>400)print f" has exceeded 400"}' f="$(basename "$f")" dir.csv; done

O en una forma equivalente sin aire:

for f in dir/*; do 
    awk -F ',' '
        $1==f{s+=$2+$3}
        END{
            print f","s
            if(s>400)print f" has exceeded 400"
        }
    ' f="$(basename "$f")" dir.csv
done

Para cada archivo dentro dir/, su nombre base (es decir, el nombre sin la ruta) se pasa al script awk como variable f.

En el script awk, el separador de campo se establece en coma con -F ','. Luego, si el primer campo de dir.csves igual a f, se agrega la suma del segundo y tercer campo s. Si la suma supera los 400, se incluye el mensaje.