Dosya adının bir listesini alın ve aynı 1. sütunun 2. ve 3. sütunlarını eklerken bir csv dosyasıyla karşılaştırın

Aug 15 2020

Şuna benzeyen bir csv dosyam var:

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

ve kullanıcının adını taşıyan boş bir dosyaya sahip bir dizin

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

Dosyayı aramak ve adını bir diziye kaydetmek, ardından bu adı csv kaydında aramak, tüm satırlar için bu adın 2. ve 3. sütunlarının tümünü eklemek ve ayrıca kullanıcı değerinin örnek: 400'ü aşıp aşmadığını göstermek istiyorum.

Örnek sonuçlar:

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

Biraz yardım için gerçekten minnettarım. Şu anda bununla uğraşıyorum, ancak sonuç yok:

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

Ya da dosya adını bir diziye kaydetmeye gerek olmayan daha basit bir yöntem var mı?

Yanıtlar

Quasímodo Aug 15 2020 at 20:13

öneririm

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

Veya çözülmemiş, eşdeğer biçimde:

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

İçindeki her dosya için dir/, temel adı (yani yolu olmayan ad), değişken olarak awk betiğine aktarılır f.

Awk komut dosyasında, alan ayırıcı virgülle ayarlanmıştır -F ','. Daha sonra 'nin ilk alanı' dir.csva eşitse f2. ve 3. alanların toplamı eklenir s. Toplam 400'ü aşarsa, mesaj eklenir.