फ़ाइल नाम की एक सूची प्राप्त करें, और उसी 1 कॉलम के 2 और 3 कॉलम को जोड़ते हुए सीएसवी फ़ाइल की तुलना करें
मेरे पास एक सीएसवी फ़ाइल है जो इस तरह दिखती है:
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
या हो सकता है कि एक सरल विधि है जहाँ फ़ाइल नाम को किसी सरणी में सहेजने की आवश्यकता नहीं है?
जवाब
मैं सुझाव देता हूँ
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 से अधिक है, तो संदेश शामिल है।