การแตกไฟล์ข้อความขนาดใหญ่สองไฟล์


32

ฉันมีสองไฟล์ใหญ่ (6GB ต่อไฟล์) ไม่มีการเรียงลำดับโดยมี linefeeds ( \n) เป็นตัวคั่น ฉันจะแยกพวกมันได้อย่างไร ควรใช้เวลาต่ำกว่า 24 ชั่วโมง

คำตอบ:


45

คำตอบที่ชัดเจนที่สุดคือการใช้คำสั่ง diff และเป็นความคิดที่ดีที่จะเพิ่มพารามิเตอร์ --speed-large-files เข้าไป

diff --speed-large-files a.file b.file

คุณพูดถึงไฟล์ที่ไม่เรียงลำดับดังนั้นคุณอาจต้องเรียงลำดับไฟล์ก่อน

sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted

คุณสามารถบันทึกการสร้างไฟล์เอาต์พุตพิเศษโดยการวางท่อเอาต์พุตเรียงลำดับที่ 2 ลงใน diff โดยตรง

sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -

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

ไม่ชัดเจนจากคำถามของคุณว่าคุณเคยลองมาก่อนหรือไม่ ถ้าเป็นเช่นนั้นก็จะเป็นประโยชน์ในการรู้ว่าสิ่งที่ผิดพลาด (ใช้เวลานานเกินไป ฯลฯ ) ฉันพบเสมอว่าคำสั่งการเรียงลำดับหุ้นและคำสั่ง diff มักจะทำอย่างน้อยเช่นเดียวกับคำสั่งที่กำหนดเองเว้นแต่ว่าจะมีคุณสมบัติเฉพาะโดเมนบางอย่างของไฟล์ที่ทำให้สามารถทำสิ่งต่าง ๆ ได้


2
+1 คุณสามารถละเว้นไฟล์ชั่วคราวทั้งหมดด้วยชื่อไพพ์ ใช้mkfifoในการสร้างก่อนที่จะใช้พวกเขาเป็นเอาท์พุทสำหรับ[ab].file.sorted sortใส่sorts ทั้งสองไว้&ในพื้นหลังและใช้ทั้ง piped เป็นชื่อไฟล์สำหรับ diff
krissi

15
@krissi คุณสามารถใช้เอฟเฟ็กต์แบบเดียวกันนี้ได้ด้วย:diff <(command 1) <(command 2)
Michael Mrozek

ขอบคุณที่ทำงาน ผมจำเป็นต้องมีคู่ของ GB หน่วยความจำความคิด แต่อินสแตนซ์ 16GB Amazon EC2 คงมัน :)
jonasl

7
ถ้าคนอย่างผมสงสัยว่าทำไม<(cmd1) <(cmd2)งานไวยากรณ์ (มันเสียงเหมือนการเปลี่ยนเส้นทางเข้ามาตรฐานสองครั้ง!) echo hello <(cmd1) <(cmd2)ลอง คุณจะเห็นบางสิ่งบางอย่างhello /dev/fd/63 /dev/fd/62ที่ทำให้ชัดเจน;)
alex

3
จากประสบการณ์ของฉัน--speed-large-filesตัวเลือกไม่ช่วยถ้าคุณมี RAM ไม่เพียงพอ นอกจากนี้การเรียงลำดับล่วงหน้าไม่เป็นประโยชน์หากคุณมีโครงสร้างระเบียนหลายบรรทัดที่คุณต้องการเก็บไว้ ตัวเลือกที่อ้างถึงข้างต้น (โดย @unhammer) มีความน่าสนใจ แต่ผลลัพธ์จากrdiffและbsdiffค่อนข้างเป็นเลขฐานสอง การติดตั้งbdiffจาก Heirloom Toolbox ดูเหมือนว่าจะเป็นงานที่น่ากลัว (ต้องใช้ Heirloom devtools, ไฟล์ส่วนหัวที่สูญพันธุ์, ... ) มันคุ้มค่ากับความพยายามหรือไม่? มีทางเลือกอื่นหรือไม่?
Christian Pietsch

5

การเรียงลำดับอินพุตและบอกdiffโปรแกรมว่าอินพุตที่เรียงลำดับแล้วนั้นจะช่วยเพิ่มความเร็วได้อย่างมาก ฉันไม่รู้อะไรเลยdiffด้วยตัวเลือกเช่นนั้น แต่commสมมติว่าอินพุตเรียงลำดับและจะเร็วกว่ามากถ้ามันเพียงพอสำหรับวัตถุประสงค์ของคุณ


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