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
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
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.csv
es igual a f
, se agrega la suma del segundo y tercer campo s
. Si la suma supera los 400, se incluye el mensaje.