ฉันมีไฟล์ขนาดใหญ่และจำเป็นต้องแยกออกเป็นสองไฟล์ สมมติว่าในไฟล์แรก 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 splitman wcsplit -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ไหม