แยกไฟล์ออกเป็นสองไฟล์


18

ฉันมีไฟล์ขนาดใหญ่และจำเป็นต้องแยกออกเป็นสองไฟล์ สมมติว่าในไฟล์แรก 1,000 บรรทัดควรเลือกและใส่ในไฟล์อื่นและลบบรรทัดเหล่านั้นในไฟล์แรก

ฉันลองใช้splitแต่กำลังสร้างหลายชิ้น


คุณตรวจสอบsplit --helpไหม
Braiam

ใช่ฉันตรวจสอบแล้ว แต่กำลังสร้างไฟล์หลายไฟล์ซึ่งไม่ต้องการให้ฉัน
Aravind

คำตอบ:


31

วิธีที่ง่ายที่สุดน่าจะใช้headและtail:

$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2

นั่นจะใส่ 1,000 บรรทัดแรกจากinput-fileเป็นoutput1และทุกบรรทัดจาก 1,001 จนถึงจุดสิ้นสุดoutput2


13

ฉันคิดว่านั่นsplitเป็นวิธีที่ดีที่สุดสำหรับคุณ

ลองใช้-l xxxxตัวเลือกโดยที่ xxxx คือจำนวนบรรทัดที่คุณต้องการในแต่ละไฟล์ (ค่าเริ่มต้นคือ 1,000)

คุณสามารถใช้-n yyตัวเลือกหากคุณมีความกังวลเกี่ยวกับจำนวนไฟล์ที่สร้างขึ้น การใช้งาน-n 2จะแบ่งไฟล์ของคุณออกเป็น 2 ส่วนโดยไม่ จำกัด จำนวนบรรทัดในแต่ละไฟล์

wc -l filenameคุณสามารถนับจำนวนของเส้นในแฟ้มของคุณด้วย นี่คือคำสั่ง 'wordcount' พร้อมตัวเลือกบรรทัด

อ้างอิง

  • man split
  • man wc

1
นี่คือวิธีแบ่งออกเป็นกลุ่มของไฟล์ที่มีจำนวนบรรทัดคงที่หรือวิธีแบ่งเท่า ๆ กันเป็นจำนวนคงที่ของไฟล์ มีวิธีการแยกเป็นหนึ่งไฟล์ 1,000 บรรทัดและอีกหนึ่งไฟล์ที่มีอย่างอื่นหรือไม่? นั่นคือสิ่งที่เขาขอ ฉันหามันไม่เจอในหน้า man
Michael Mrozek

คุณถูกต้องไมเคิล ฉันคิดว่าฉันใช้มุมมองที่เรียบง่ายสำหรับคำถาม ทางออกของคุณดีที่สุดในกรณีนี้ อีกวิธีหนึ่งคือใช้คำสั่ง 'sed': sed -n 1,1000 ไฟล์ต้นฉบับ> first_1000_lines sed '1,1000d' originalfile> left_lines
Lucien Raven

split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??แน่นอนคุณสามารถทำ
G-Man กล่าวว่า 'Reinstate Monica'

8

นี่คืองานสำหรับ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

1
ว้าวจริงๆมันเป็นcsplitงานสำหรับ ดีมาก. (ฉันเพิ่งอ่านรายการคำสั่ง POSIX และมีปัญหาใหญ่ล้อมรอบcsplitวัตถุประสงค์ของคำสั่งในตอนแรกปรากฎว่ามันเป็นเรื่องง่ายจริงๆ) :)
Wildcard

4

วิธีง่ายๆในการทำสิ่งที่คำถามถามในหนึ่งคำสั่ง:

awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile

หรือสำหรับคนที่เกลียดการพิมพ์คำสั่งยาว ๆ ที่เข้าใจง่าย

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.