การรวมไฟล์ CSV หลายไฟล์โดยไม่รวมส่วนหัว


21

ฉันต้องรวมไฟล์. CSV หลายไฟล์ (โดยใช้catคำสั่ง) แต่ไม่มีการคัดลอกส่วนหัวสำหรับแต่ละไฟล์

วิธีที่ดีที่สุดในการทำภารกิจนี้ให้สำเร็จคืออะไร?

คำตอบ:


32

คุณจะต้องมากกว่า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

4
ฉันพบสิ่งนี้กำลังมองหาคำตอบทั่วไปของ linux แต่ในกรณีของฉันสิ่งนี้ไม่ได้ผล มันจะละเว้น file1.csv อย่างเงียบ ๆ ฉันต้องการแมวไฟล์นั้น cat <(cat file1.csv) <(tail +2 file2.csv) <(tail +2 file3.csv) > bigfile.csv
Lelon

ฉันได้รับ tail + 2: ไม่พบคำสั่งเมื่อฉันใช้ cat <file1.csv <(tail +2 file2.csv) <(tail +2 file3.csv)> วิธีการ

@ user64636 ควรมีช่องว่างระหว่าง tail และ +2
nohillside

ที่จริงผมมีการใช้tail -n+2, tail +2จะไม่ทำงาน
Matthieu นาโปลี

12

ฉันเห็นด้วยกับคำตอบสูงสุด แต่ฉันขอแนะนำให้ขยายด้วยสถานการณ์ต่อไปนี้ (เพราะฉันไม่สามารถแสดงความคิดเห็น):

หากคุณต้องการให้ไฟล์เอาต์พุตมีส่วนหัว (หนึ่งครั้ง) สคริปต์ที่ถูกต้องคือ:

awk '(NR == 1) || (FNR > 1)' file*.csv > bigfile.csv

FNR แสดงถึงจำนวนของบันทึกการประมวลผลในไฟล์เดียว และ NR แสดงถึงทั่วโลกดังนั้นบรรทัดแรกจึงเป็นที่ยอมรับและส่วนที่เหลือจะถูกละเว้นเหมือนเมื่อก่อน


7

คุณสามารถใช้คำสั่งกลุ่ม ( { ; }) แทนการทดแทนกระบวนการ ( <()):

{ head -n1 file1.csv; for f in file*.csv; do tail -n+2 "$f"; done; } > new.csv

นอกจากนี้ยังทำงานร่วมกับจุดสิ้นสุดของบรรทัด CRLF ตราบใดที่ไฟล์ลงท้ายด้วยบรรทัดว่าง ( \r\n)

ส่วนหัวและท้ายของรุ่นตัวเลขนั้นล้าสมัยแล้วโดย POSIX 1003.1-2001 และทำให้เกิดคำเตือนในบางสภาพแวดล้อม


2

ต้องการเชื่อมต่อ CSV ขนาดใหญ่สองรายการที่มีคอลัมน์ที่เหมือนกันลงใน CSV ที่มีขนาดใหญ่ขึ้นสำหรับสคริปต์ที่แยกกัน (ข้อมูลไม่มี id ที่ไม่ซ้ำกัน)

ก่อนเอาส่วนหัวออกจาก csv ที่สอง

awk 'FNR > 1' file2.csv > file2_noheading.csv

ถัดไปตัดแบ่งผ่านสิ่งต่อไปนี้

cat file1.csv file2_noheading.csv > newfile.csv

1

การใช้ลำดับคำสั่งด้านบนส่งผลให้ไฟล์มีลักษณะดังนี้:

header,of,csv1
contents,of,csv1
==> csv2.csv

contents,of,csv2

เพื่อให้เป็น CSV ที่เหมาะสมโดยมีบรรทัดส่วนหัวหนึ่งบรรทัดและค่าที่เกี่ยวข้องทั้งหมดฉันจึงใช้sedคาถาต่อไปนี้...sed -ie "/^$/d;/^==>/d" bigfile.csv


0

วิธีแก้ปัญหาที่ง่ายกว่าถ้าคุณมีไฟล์มากมาย:

awk 'FNR > 1' *.csv > merged.csv

เพียงกลับไปแก้ไขไฟล์ขนาดใหญ่และเพิ่มส่วนหัวกลับเข้าไป


คำตอบของคุณต่างจากสิ่งที่ iolsmit พร้อมนำเสนอในปี 2556 awk 'FNR > 1' file*.csv > bigfile.csvอย่างไร มันไม่ใช่!
user3439894

Re: มันแตกต่างกันยังไง? มันเป็นคำตอบที่สั้นกว่าและคำตอบที่ฉันคัดลอกและวางอย่างน้อย:) ได้รับการโหวตของฉัน
Rick Davies

นี่เป็นคำตอบที่ดีเพราะคุณไม่ต้องการไฟล์ทั้งหมดที่จะเริ่มต้นด้วยfile
big_smile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.