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
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
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.csv
est égal à f
, la somme des 2e et 3e champs est ajoutée à s
. Si la somme dépasse 400, le message est inclus.