फ़ाइल नाम की एक सूची प्राप्त करें, और उसी 1 कॉलम के 2 और 3 कॉलम को जोड़ते हुए सीएसवी फ़ाइल की तुलना करें

Aug 15 2020

मेरे पास एक सीएसवी फ़ाइल है जो इस तरह दिखती है:

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

और एक निर्देशिका जिसमें उपयोगकर्ता के नाम पर एक खाली फ़ाइल है

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

मैं फ़ाइल ढूंढना चाहता हूं और उसका नाम एक सरणी में सहेजना चाहता हूं, फिर उस नाम को csv रिकॉर्ड के माध्यम से खोजें, सभी पंक्तियों के लिए उस नाम का दूसरा और तीसरा स्तंभ जोड़ें, और यह भी दिखाता है कि उपयोगकर्ता मान पूर्व से अधिक है: 400

उदाहरण के परिणाम:

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

मैं वास्तव में कुछ मदद की सराहना करेंगे। वर्तमान में मैं इसके साथ प्रयास कर रहा हूं, लेकिन कोई परिणाम नहीं:

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

या हो सकता है कि एक सरल विधि है जहाँ फ़ाइल नाम को किसी सरणी में सहेजने की आवश्यकता नहीं है?

जवाब

Quasímodo Aug 15 2020 at 20:13

मैं सुझाव देता हूँ

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

या बराबरी में, समकक्ष रूप:

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

अंदर प्रत्येक फ़ाइल के लिए dir/, इसका बेसनेम (यानी, पथ के बिना नाम) चर के रूप में awk स्क्रिप्ट को दिया जाता है f

Awk script में, फ़ील्ड विभाजक के साथ अल्पविराम पर सेट किया गया है -F ','। फिर, यदि प्रथम फ़ील्ड के dir.csvबराबर है f, तो 2nd और 3rd फ़ील्ड का योग जोड़ा जाता है s। यदि योग 400 से अधिक है, तो संदेश शामिल है।