Obtenez une liste de nom de fichier, et comparez-la à un fichier csv en ajoutant la 2e et la 3e colonne de la même 1ère colonne

Aug 15 2020

J'ai un fichier csv qui ressemble à ceci:

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

et un répertoire qui a un fichier vide nommé d'après l'utilisateur

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

Je veux rechercher le fichier et enregistrer son nom dans un tableau, puis rechercher ce nom dans l'enregistrement csv, ajouter toutes les 2e et 3e colonnes de ce nom, pour toutes les lignes, et montre également si la valeur utilisateur dépasse ex: 400

Exemple de résultats:

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

J'apprécierais vraiment de l'aide. Actuellement j'essaye avec ceci, mais aucun résultat:

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

Ou peut-être existe-t-il une méthode plus simple où il n'est pas nécessaire d'enregistrer le nom de fichier dans un tableau?

Réponses

Quasímodo Aug 15 2020 at 20:13

je suggère

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

Ou sous forme équivalente déroulée:

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

Pour chaque fichier à l'intérieur dir/, son nom de base (c'est-à-dire le nom sans le chemin) est passé au script awk comme variable f.

Dans le script awk, le séparateur de champ est défini sur une virgule avec -F ','. Ensuite, si le premier champ de dir.csvest égal à f, la somme des 2e et 3e champs est ajoutée à s. Si la somme dépasse 400, le message est inclus.