แยกไฟล์ออกเป็นสองไฟล์ตามบรรทัดที่ระบุ


12

ฉันกำลังมองหาวิธีในยูนิกซ์ที่จะแยกไฟล์เป็นสองไฟล์ที่หมายเลขบรรทัดที่กำหนด

split -l 100 file_nameใกล้เคียงกับสิ่งที่ฉันกำลังค้นหา แต่คำสั่งนี้สร้างหลายไฟล์แต่ละ 100 บรรทัด ฉันกำลังมองหาคำสั่งเพื่อแยกไฟล์เป็นสองไฟล์ที่หมายเลขบรรทัดที่กำหนด มีวิธีการทำเช่นนี้ในยูนิกซ์หรือไม่?

คำตอบ:


13

วิธีการแก้ปัญหาที่เข้มงวดมากขึ้น:

(head -100 > f1.txt; cat > f2.txt) < input.txt

1
ทางออกที่ดี ไม่มีการนับwcก่อนและไฟล์อินพุตยังคงถูกประมวลผลเพียงครั้งเดียวเช่นเดียวกับawkโซลูชัน
Dubu

2
มีโอกาสเล็กน้อยที่headจะอ่านมากกว่า 100 บรรทัดเพื่อค้นหา 100 บรรทัดแรกที่จะส่งออกเป็นf1.txt; catไบต์พิเศษเหล่านั้นจะมองไม่เห็นโดย
chepner

นี่คือการแช่งช้า
sdaffa23fdsf

12

ใช้awkเพื่อที่คุณจะต้องทำการส่งผ่านไฟล์อินพุตเพียงครั้งเดียว ต่อไปนี้จะถือว่าคุณต้องการ 122 บรรทัดแรกในไฟล์แรกและส่วนที่เหลือในไฟล์ที่สอง

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name

สิ่งนี้สมควรได้รับยกนิ้ว หากคุณต้องการแยกไฟล์จาก X เป็น Y นี่เป็นวิธีที่ง่ายที่สุด
Glenn Plas

นี่เป็นวิธีที่ง่ายที่สุดที่จะเข้าใจ ทำงานเหมือนมีเสน่ห์ ... และทำให้ฉันคิดว่าฉันควรปัดฝุ่นออกจากหนังสือ O'Reilly Sed & Awk ที่ฉันมีมาตั้งแต่ปี 1999 หรือมากกว่านั้นส่วนของ sed นั้นอ่านได้ดีส่วน awk ไม่มาก
Michael

นี่ดีกว่าโซลูชันที่ยกเว้นสำหรับเหตุผลที่ @chepner metioned ในข้อคิดเห็น คุณจะหลวมอักขระในไฟล์ 'f2.txt' วิธีนี้ถูกต้องและมีประสิทธิภาพ awk ftw
Goran

7

คุณสามารถใช้headและtailรับทั้งสองส่วน:

head -n K file_name > top_file
tail -n L file_name > bottom_file

โดยที่KคือหมายเลขบรรทัดและLเป็นจำนวนบรรทัดจากด้านล่าง (จำนวนบรรทัดทั้งหมด - K)

(คุณสามารถรับจำนวนบรรทัดทั้งหมดโดยใช้wc -l file_name)


5

คุณสามารถใช้csplit(ถ้ามี) เพื่อทำสิ่งต่อไปนี้:

csplit file N+1

จะแยกไฟล์ออกเป็นสองส่วนหนึ่งชิ้นขึ้นไป (และรวมถึง) หมายเลขบรรทัดNและอีกส่วนหนึ่งจากหมายเลขบรรทัดN+1จนถึงบรรทัดสุดท้าย
หากคุณต้องการแยกหมายเลขบรรทัด (แต่ไม่รวม) N:

csplit file N

เป็นสิ่งที่ดี! ขอบคุณมันแก้ปัญหาได้อย่างสมบูรณ์แบบสำหรับฉัน
Zertrin

ประสิทธิภาพที่ดีที่สุดสำหรับการแยกไฟล์ 20GB ออกเป็นชิ้น ๆ
dr0i

@ dr0i - ไม่น่าแปลกใจcsplitเหมาะสำหรับงานนี้
don_crissti

แยก 200M เส้นไฟล์ฉันได้ "ความทรงจำหมด" ใช้ csplit กลับวันที่ 2008 ลงวันที่ csplit ใช้กับ 2011 มันทำงาน :)
dr0i

4

ทั้งคู่headและtailมีตัวเลือกในการสร้างบรรทัดจากส่วนท้าย "อื่น ๆ " ของไฟล์มากกว่าที่พวกเขาต้องการ ดังนั้นคุณมีสองตัวเลือกเหล่านี้:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

หรือ (โดยที่ NNN น้อยกว่า 100 ผลลัพธ์wc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

คุณสามารถอ่านหน้าคู่มือสำหรับรุ่นของคุณheadและtailสำหรับข้อมูลเพิ่มเติม


0

คุณสามารถใช้ 'wc', 'dc', 'head' และ 'tail' กล่าวคือ

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

เพื่อความสะดวกในการใช้งานคุณสามารถเปลี่ยนเป็นสคริปต์เชลล์ได้

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