ฉันต้องรวมไฟล์. CSV หลายไฟล์ (โดยใช้cat
คำสั่ง) แต่ไม่มีการคัดลอกส่วนหัวสำหรับแต่ละไฟล์
วิธีที่ดีที่สุดในการทำภารกิจนี้ให้สำเร็จคืออะไร?
ฉันต้องรวมไฟล์. CSV หลายไฟล์ (โดยใช้cat
คำสั่ง) แต่ไม่มีการคัดลอกส่วนหัวสำหรับแต่ละไฟล์
วิธีที่ดีที่สุดในการทำภารกิจนี้ให้สำเร็จคืออะไร?
คำตอบ:
คุณจะต้องมากกว่าcat
คำสั่งดังที่อธิบายไว้ที่นี่ :
สมมติว่าคุณมีไฟล์ CSV 3 ไฟล์: file1.csv
, file2.csv
และfile3.csv
และต้องการเข้าร่วมbigfile.csv
และส่วนหัวของคุณจะเป็นบรรทัดแรกเสมอ (เท่านั้น) จากนั้นใช้
อย่างใดอย่างหนึ่ง (เก็บส่วนหัวจากไฟล์แรก "file1.csv"):
cat file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
หรือ (ลบส่วนหัวออกจากไฟล์ทั้งหมดที่ชื่อขึ้นต้นด้วย "file"):
awk 'FNR > 1' file*.csv > bigfile.csv
tail -n+2
, tail +2
จะไม่ทำงาน
ฉันเห็นด้วยกับคำตอบสูงสุด แต่ฉันขอแนะนำให้ขยายด้วยสถานการณ์ต่อไปนี้ (เพราะฉันไม่สามารถแสดงความคิดเห็น):
หากคุณต้องการให้ไฟล์เอาต์พุตมีส่วนหัว (หนึ่งครั้ง) สคริปต์ที่ถูกต้องคือ:
awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv
FNR แสดงถึงจำนวนของบันทึกการประมวลผลในไฟล์เดียว และ NR แสดงถึงทั่วโลกดังนั้นบรรทัดแรกจึงเป็นที่ยอมรับและส่วนที่เหลือจะถูกละเว้นเหมือนเมื่อก่อน
คุณสามารถใช้คำสั่งกลุ่ม ( { ; }
) แทนการทดแทนกระบวนการ ( <()
):
{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv
นอกจากนี้ยังทำงานร่วมกับจุดสิ้นสุดของบรรทัด CRLF ตราบใดที่ไฟล์ลงท้ายด้วยบรรทัดว่าง ( \r\n
)
ส่วนหัวและท้ายของรุ่นตัวเลขนั้นล้าสมัยแล้วโดย POSIX 1003.1-2001 และทำให้เกิดคำเตือนในบางสภาพแวดล้อม
ต้องการเชื่อมต่อ CSV ขนาดใหญ่สองรายการที่มีคอลัมน์ที่เหมือนกันลงใน CSV ที่มีขนาดใหญ่ขึ้นสำหรับสคริปต์ที่แยกกัน (ข้อมูลไม่มี id ที่ไม่ซ้ำกัน)
ก่อนเอาส่วนหัวออกจาก csv ที่สอง
awk 'FNR > 1' file2.csv > file2_noheading.csv
ถัดไปตัดแบ่งผ่านสิ่งต่อไปนี้
cat file1.csv file2_noheading.csv > newfile.csv
การใช้ลำดับคำสั่งด้านบนส่งผลให้ไฟล์มีลักษณะดังนี้:
header,of,csv1
contents,of,csv1
==> csv2.csv
contents,of,csv2
เพื่อให้เป็น CSV ที่เหมาะสมโดยมีบรรทัดส่วนหัวหนึ่งบรรทัดและค่าที่เกี่ยวข้องทั้งหมดฉันจึงใช้sed
คาถาต่อไปนี้...sed -ie "/^$/d;/^==>/d" bigfile.csv
วิธีแก้ปัญหาที่ง่ายกว่าถ้าคุณมีไฟล์มากมาย:
awk 'FNR > 1' *.csv > merged.csv
เพียงกลับไปแก้ไขไฟล์ขนาดใหญ่และเพิ่มส่วนหัวกลับเข้าไป
awk 'FNR > 1' file*.csv > bigfile.csv
อย่างไร มันไม่ใช่!
file
cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv