Uzyskaj listę nazw plików i porównaj z plikiem csv, dodając drugą i trzecią kolumnę tej samej pierwszej kolumny

Aug 15 2020

Mam plik CSV, który wygląda następująco:

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

oraz katalog, który ma pusty plik nazwany na cześć użytkownika

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

Chcę poszukać pliku i zapisać jego nazwę w tablicy, a następnie przeszukać tę nazwę w rekordzie csv, dodać całą drugą i trzecią kolumnę tej nazwy dla wszystkich wierszy, a także pokazać, czy wartość użytkownika przekracza ex: 400

Przykładowe wyniki:

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

Naprawdę byłbym wdzięczny za pomoc. Obecnie próbuję z tym, ale brak wyników:

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

A może istnieje prostsza metoda, w której nie ma potrzeby zapisywania nazwy pliku w tablicy?

Odpowiedzi

Quasímodo Aug 15 2020 at 20:13

sugeruję

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

Lub w odwiniętej, równoważnej formie:

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

Dla każdego pliku w środku dir/jego podstawowa nazwa (tj. Nazwa bez ścieżki) jest przekazywana do skryptu awk jako zmienna f.

W skrypcie awk jako separator pól ustawiany jest przecinek z -F ','. Następnie, jeśli pierwsze pole dir.csvjest równe f, suma pól drugiego i trzeciego jest dodawana s. Jeśli suma przekroczy 400, wiadomość zostanie uwzględniona.