ฉันมีสองไฟล์ใหญ่ (6GB ต่อไฟล์) ไม่มีการเรียงลำดับโดยมี linefeeds ( \n) เป็นตัวคั่น ฉันจะแยกพวกมันได้อย่างไร ควรใช้เวลาต่ำกว่า 24 ชั่วโมง
ฉันมีสองไฟล์ใหญ่ (6GB ต่อไฟล์) ไม่มีการเรียงลำดับโดยมี linefeeds ( \n) เป็นตัวคั่น ฉันจะแยกพวกมันได้อย่างไร ควรใช้เวลาต่ำกว่า 24 ชั่วโมง
คำตอบ:
คำตอบที่ชัดเจนที่สุดคือการใช้คำสั่ง 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 มักจะทำอย่างน้อยเช่นเดียวกับคำสั่งที่กำหนดเองเว้นแต่ว่าจะมีคุณสมบัติเฉพาะโดเมนบางอย่างของไฟล์ที่ทำให้สามารถทำสิ่งต่าง ๆ ได้
diff <(command 1) <(command 2)
<(cmd1) <(cmd2)งานไวยากรณ์ (มันเสียงเหมือนการเปลี่ยนเส้นทางเข้ามาตรฐานสองครั้ง!) echo hello <(cmd1) <(cmd2)ลอง คุณจะเห็นบางสิ่งบางอย่างhello /dev/fd/63 /dev/fd/62ที่ทำให้ชัดเจน;)
--speed-large-filesตัวเลือกไม่ช่วยถ้าคุณมี RAM ไม่เพียงพอ นอกจากนี้การเรียงลำดับล่วงหน้าไม่เป็นประโยชน์หากคุณมีโครงสร้างระเบียนหลายบรรทัดที่คุณต้องการเก็บไว้ ตัวเลือกที่อ้างถึงข้างต้น (โดย @unhammer) มีความน่าสนใจ แต่ผลลัพธ์จากrdiffและbsdiffค่อนข้างเป็นเลขฐานสอง การติดตั้งbdiffจาก Heirloom Toolbox ดูเหมือนว่าจะเป็นงานที่น่ากลัว (ต้องใช้ Heirloom devtools, ไฟล์ส่วนหัวที่สูญพันธุ์, ... ) มันคุ้มค่ากับความพยายามหรือไม่? มีทางเลือกอื่นหรือไม่?
การเรียงลำดับอินพุตและบอกdiffโปรแกรมว่าอินพุตที่เรียงลำดับแล้วนั้นจะช่วยเพิ่มความเร็วได้อย่างมาก ฉันไม่รู้อะไรเลยdiffด้วยตัวเลือกเช่นนั้น แต่commสมมติว่าอินพุตเรียงลำดับและจะเร็วกว่ามากถ้ามันเพียงพอสำหรับวัตถุประสงค์ของคุณ
commใช้งานได้ดีสำหรับเรื่องนี้ไม่เคยได้ยินมาก่อน แต่ดูเหมือนจะอยู่ใน coreutils
mkfifoในการสร้างก่อนที่จะใช้พวกเขาเป็นเอาท์พุทสำหรับ[ab].file.sortedsortใส่sorts ทั้งสองไว้&ในพื้นหลังและใช้ทั้ง piped เป็นชื่อไฟล์สำหรับ diff