รับรายการชื่อไฟล์และเปรียบเทียบกับไฟล์ csv ในขณะที่เพิ่มคอลัมน์ที่ 2 และ 3 ของคอลัมน์ที่ 1 เดียวกัน

Aug 15 2020

ฉันมีไฟล์ csv ที่มีลักษณะดังนี้:

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 เพิ่มคอลัมน์ที่ 2 และ 3 ของชื่อนั้นทั้งหมดสำหรับแถวทั้งหมดและยังแสดงว่าค่าผู้ใช้เกินหรือไม่เช่น 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/, basename ของมัน (เช่นชื่อโดยไม่ต้องเส้นทาง) จะถูกส่งผ่านไปยังสคริปต์ awk fเป็นตัวแปร

ในสคริปต์ awk -F ','ที่คั่นฟิลด์ถูกตั้งค่าให้กับจุลภาค แล้วถ้าฟิลด์แรกของdir.csvมีค่าเท่ากับfผลรวมของเขตที่ 2 และ 3 sจะถูกเพิ่ม หากผลรวมเกิน 400 ข้อความจะรวมอยู่ด้วย