ฉันมีไฟล์ขนาดใหญ่และจำเป็นต้องแยกออกเป็นสองไฟล์ สมมติว่าในไฟล์แรก 1,000 บรรทัดควรเลือกและใส่ในไฟล์อื่นและลบบรรทัดเหล่านั้นในไฟล์แรก
ฉันลองใช้split
แต่กำลังสร้างหลายชิ้น
ฉันมีไฟล์ขนาดใหญ่และจำเป็นต้องแยกออกเป็นสองไฟล์ สมมติว่าในไฟล์แรก 1,000 บรรทัดควรเลือกและใส่ในไฟล์อื่นและลบบรรทัดเหล่านั้นในไฟล์แรก
ฉันลองใช้split
แต่กำลังสร้างหลายชิ้น
คำตอบ:
วิธีที่ง่ายที่สุดน่าจะใช้head
และtail
:
$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2
นั่นจะใส่ 1,000 บรรทัดแรกจากinput-file
เป็นoutput1
และทุกบรรทัดจาก 1,001 จนถึงจุดสิ้นสุดoutput2
ฉันคิดว่านั่นsplit
เป็นวิธีที่ดีที่สุดสำหรับคุณ
ลองใช้-l xxxx
ตัวเลือกโดยที่ xxxx คือจำนวนบรรทัดที่คุณต้องการในแต่ละไฟล์ (ค่าเริ่มต้นคือ 1,000)
คุณสามารถใช้-n yy
ตัวเลือกหากคุณมีความกังวลเกี่ยวกับจำนวนไฟล์ที่สร้างขึ้น การใช้งาน-n 2
จะแบ่งไฟล์ของคุณออกเป็น 2 ส่วนโดยไม่ จำกัด จำนวนบรรทัดในแต่ละไฟล์
wc -l filename
คุณสามารถนับจำนวนของเส้นในแฟ้มของคุณด้วย นี่คือคำสั่ง 'wordcount' พร้อมตัวเลือกบรรทัด
man split
man wc
split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??
แน่นอนคุณสามารถทำ
นี่คืองานสำหรับcsplit
:
csplit -s infile 1001
จะs
แยกinfile
ชิ้นส่วนแรกอย่างชัดเจนxx00
- ขึ้นไป แต่ไม่รวมบรรทัด 1001 และชิ้นที่สองxx01
- บรรทัดที่เหลือ
คุณสามารถเล่นกับตัวเลือกหากคุณต้องการชื่อไฟล์ที่แตกต่างกันเช่นการใช้-f
และการระบุคำนำหน้า :
csplit -sf piece. infile 1001
สร้างสองไฟล์ชื่อpiece.00
และpiece.01
ด้วยสมาร์ทhead
คุณสามารถทำสิ่งที่ชอบ:
{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile
csplit
งานสำหรับ ดีมาก. (ฉันเพิ่งอ่านรายการคำสั่ง POSIX และมีปัญหาใหญ่ล้อมรอบcsplit
วัตถุประสงค์ของคำสั่งในตอนแรกปรากฎว่ามันเป็นเรื่องง่ายจริงๆ) :)
วิธีง่ายๆในการทำสิ่งที่คำถามถามในหนึ่งคำสั่ง:
awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile
หรือสำหรับคนที่เกลียดการพิมพ์คำสั่งยาว ๆ ที่เข้าใจง่าย
awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
split --help
ไหม