Rufen Sie eine Liste mit Dateinamen ab und vergleichen Sie diese mit einer CSV-Datei, während Sie die 2. und 3. Spalte derselben 1. Spalte hinzufügen

Aug 15 2020

Ich habe eine CSV-Datei, die so aussieht:

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

und ein Verzeichnis mit einer leeren Datei, die nach dem Benutzer benannt ist

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

Ich möchte nach der Datei suchen und ihren Namen in einem Array speichern, dann diesen Namen im CSV-Datensatz durchsuchen, die 2. und 3. Spalte dieses Namens für alle Zeilen hinzufügen und auch anzeigen, ob der Benutzerwert ex: 400 überschreitet

Beispielergebnisse:

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

Ich würde mich sehr über Hilfe freuen. Derzeit versuche ich damit, aber keine Ergebnisse:

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

Oder gibt es eine einfachere Methode, bei der der Dateiname nicht in einem Array gespeichert werden muss?

Antworten

Quasímodo Aug 15 2020 at 20:13

Ich schlage vor

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

Oder in entspannter, gleichwertiger Form:

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

Für jede darin enthaltene Datei dir/wird ihr Basisname (dh der Name ohne Pfad) als Variable an das awk-Skript übergeben f.

Im awk-Skript wird das Feldtrennzeichen auf Komma gesetzt -F ','. Wenn dann das erste Feld von dir.csvgleich ist, fwird die Summe der zweiten und dritten Felder addiert s. Wenn die Summe 400 überschreitet, wird die Nachricht eingeschlossen.