แยกส่วนตรงกลางของบรรทัดของไฟล์ข้อความหรือไม่


17

ฉันกำลังเขียนสคริปต์ PHP เพื่อแยกไฟล์ข้อความขนาดใหญ่เพื่อแทรกฐานข้อมูลจากมัน อย่างไรก็ตามในโฮสต์ของฉันไฟล์มีขนาดใหญ่เกินไปและฉันใช้หน่วยความจำเกินขีด จำกัด สำหรับ PHP

ไฟล์นี้มีประมาณ 16,000 บรรทัด ฉันต้องการแยกไฟล์ออกเป็นสี่ไฟล์ (ตอนแรก) เพื่อดูว่าฉันสามารถโหลดไฟล์เหล่านั้นได้หรือไม่

head -4000 file.txtส่วนแรกที่ผมจะได้รับกับ ส่วนตรงกลางนั้นค่อนข้างซับซ้อนกว่าเดิม - ฉันคิดถึงการtailส่งออกpip ไปยังhead( tail -4001 file.txt | head -4000 > section2.txt) แต่มีวิธีอื่นหรือดีกว่า

อันที่จริงตรรกะของฉันถูกทำให้ยุ่งเหยิง - สำหรับส่วนที่สองฉันต้องมีบางอย่างที่ชอบtail -12001 file.txt | head - 4000แล้วลดtailอาร์กิวเมนต์สำหรับส่วนถัดไป ฉันเริ่มสับสนแล้ว! : P

คำตอบ:


27

หากคุณไม่ต้องการให้เกิดความสับสน แต่ยังคงใช้งานอยู่tailและheadมีวิธีที่มีประโยชน์ในการเรียกtailใช้การนับบรรทัดจากจุดเริ่มต้นไม่ใช่จุดสิ้นสุด:

tail -n +4001 yourfile | head -4000

... แต่เครื่องมืออัตโนมัติที่ดีกว่าที่สร้างขึ้นสำหรับการแยกไฟล์จะถูกเรียกว่า ... split! มันเป็นส่วนหนึ่งของ coreutils ของ GNU ด้วยดังนั้นระบบ Linux ทั่วไปก็ควรมี นี่คือวิธีการใช้งาน:

split -l 4000 yourInputFile thePrefixForOutputFiles

(ดูman splitว่ามีข้อสงสัย)


19

รวมหัวกับหางอย่างที่คุณเคยทำ แต่ฉันจะใช้มัน sed

sed -n '1,4000p' input_file # print lines 1-4000 of input_file

สิ่งนี้ช่วยให้คุณแก้ปัญหาของคุณด้วยฟังก์ชั่นเปลือกด่วน

chunk_it(){
    step=4
    start=1
    end=$step
    for n in {1..4} ; do
        sed -n "${start},${end}p" "$1" > "$1".$start-$end
        let start+=$step
        let end+=$step
    done
}

chunk_it your_file

ตอนนี้คุณมี your_file.1-4000 และ yuor_file.4001-8000 และอื่น ๆ

หมายเหตุ: ต้องทุบตี


3
ฉันชอบวิธีที่ไม่ดี
fanchyna

สิ่งนี้ไม่ได้ผลสำหรับฉันเพราะ sed ไม่ออก มันพิมพ์บรรทัดที่ฉันต้องการ stdout แต่ฉันต้อง ctrl-c out และด้วยเหตุนี้ฉันจึงไม่สามารถเปลี่ยนเส้นทางไปยังไฟล์ได้ ข้อเสนอแนะใด ๆ เพื่อให้ใช้งานได้?
Brent212

คิดออก! "sed -n '<start_line>, <end_line> w <output_file>' <input_file>" ใช้ได้สำหรับฉัน
Brent212

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