เชลล์สคริปต์เพื่อต่อท้ายข้อความในไฟล์ csv ตามข้อ จำกัด


1

ในโครงการของฉันฉันมีไฟล์มากมายที่ชื่อว่า“ config.csv” ความต้องการของฉันคือการเพิ่มการกำหนดค่าในตอนท้ายของไฟล์ตามข้อ จำกัด บางอย่าง

- Get All config.csv files across the project.
- The config.csv should have 7 columns.
- Add if the property does not exist then add one at the end of the file.
- Sometimes there might be a new line character at the end. sometimes there might not be.

สถานที่ให้บริการมีลักษณะเช่นนี้

1/1/1970,,propertyName,"Description of the Config","false",,1

ฉันจะเขียนสคริปต์เพื่อทำงานนี้ได้อย่างไร

ข้อจำกัดความรับผิดชอบ: ฉันใหม่สำหรับการเขียนสคริปต์และต้องการทำให้กระบวนการของงานนั้นเป็นไปโดยอัตโนมัติมากที่สุดเท่าที่จะทำได้

คำตอบ:


1

สร้างไฟล์ต่อไปนี้:

add_conf.awk:

BEGIN {FS=","}
NF!=7 {bad=1; exit 1}
      {print}
END   {if (!bad) print "1/1/1970,,propertyName,\"Description of the Config\",\"false\",,1"}

add_conf.sh:

#!/bin/sh
tempfile=$(mktemp)

for f
do
        if awk -f add_conf.awk "$f" > "$tempfile"
        then
                cp "$tempfile" "$f"
        fi
done

rm "$tempfile"

chmod +x add_conf.shและทำ (แน่นอนคุณสามารถวางไฟล์เหล่านี้ไว้ที่อื่นที่ไม่ใช่ไดเรกทอรีปัจจุบันเพียงปรับการอ้างอิงชื่อไฟล์ตามนั้น) จากนั้นทำ

find . -name config.csv -type f -exec ./add_conf.sh {} +

findคำสั่งจะพบไฟล์ธรรมดาชื่อทั้งหมดconfig.csv และผ่านชื่อ (เส้นทาง) add_conf.shของพวกเขาไป สคริปต์นั้นเรียกใช้awkไฟล์แต่ละไฟล์โดยเขียนเอาต์พุตไปยังไฟล์ชั่วคราว หากawkกระบวนการรายงานความสำเร็จสคริปต์จะคัดลอกเอาต์พุตกลับไปยังไฟล์อินพุต

awkสคริปต์add_conf.awkชุดคั่นฟิลด์ (FS) เพื่อจุลภาค (ซึ่งเป็นสิ่งที่เห็นได้ชัดจะทำอย่างไรเมื่อต้องรับมือกับไฟล์คั่นด้วยเครื่องหมายจุลภาค) หากพบบรรทัดที่มีฟิลด์อื่นที่นอกเหนือจากเจ็ดฟิลด์ (คั่นด้วยเครื่องหมายจุลภาค) จะตั้งbadค่าสถานะและออกด้วยสถานะ 1 ดังนั้นเชลล์สคริปต์จะเห็นว่าไฟล์นี้ไม่มีคุณสมบัติที่เหมาะสมและจะปล่อยให้อยู่คนเดียว มิฉะนั้นจะพิมพ์บรรทัดอินพุตแต่ละบรรทัดไปยังไฟล์เอาต์พุต (ชั่วคราว) มันจะเพิ่มขึ้นบรรทัดใหม่ให้กับบรรทัดสุดท้ายหากจำเป็น จากนั้นหากไฟล์ตกลงจนถึงจุดสิ้นสุดให้เพิ่มบรรทัดข้อมูลใหม่

หมายเหตุ:

  • ดังกล่าวข้างต้นถูกเขียนขึ้นสำหรับ awkGNU POSIX awkไม่ได้ระบุพฤติกรรมสำหรับข้อมูลอินพุตที่ไม่ได้ลงท้ายด้วย newline และไม่สนับสนุนexitคำสั่ง
  • ฉันไม่สนใจสัญลักษณ์ข้อที่สามของคุณ“ ถ้าคุณสมบัตินั้นไม่มีอยู่ให้เพิ่มอีกหนึ่งไฟล์ที่ส่วนท้ายของไฟล์” อาจเพิ่มได้อย่างง่ายดายหากคุณชี้แจงว่าคุณหมายถึงอะไร

จะเกิดอะไรขึ้นเมื่อ "คำอธิบายของการกำหนดค่า" มีเครื่องหมายจุลภาค
codefreak

@ codefreak: พูดอย่างเคร่งครัดฉันไม่แน่ใจว่ามันจะสำคัญอย่างไร แต่ฉันเชื่อว่าคุณกำลังถามจริง ๆ "จะเกิดอะไรขึ้นถ้าข้อมูลที่มีอยู่ก่อนหน้าในไฟล์มีเครื่องหมายจุลภาคที่อ้างอิงอยู่ภายในค่า" และนั่นคือจุดที่ถูกต้อง - เอ็นจินการแยกฟิลด์ของ awk ไม่ฉลาดพอที่จะจัดการกับสิ่งนั้นได้อย่างถูกต้องดังนั้นNFจะไม่มีค่า "ถูกต้อง" ดังนั้นการทดสอบโดยยึดตามNFอาจให้ผลลัพธ์ที่ไม่ถูกต้อง  awkไม่ใช่เครื่องมือที่สมบูรณ์แบบสำหรับจัดการกับข้อมูล CSV
G-Man

"จะเกิดอะไรขึ้นหากข้อมูลที่มีอยู่ในไฟล์มีเครื่องหมายจุลภาคที่อยู่ภายในค่านั้น" นั่นคือสิ่งที่ฉันหมายถึง หลักสูตรที่ดีที่สุดของ @ FurqanShaikh อาจใช้เครื่องมือการแยกวิเคราะห์ csv หรือภาษาสคริปต์เช่น python / ruby
codefreak
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.