ฉันมีสองไฟล์ใหญ่ (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.sorted
sort
ใส่sort
s ทั้งสองไว้&
ในพื้นหลังและใช้ทั้ง piped เป็นชื่อไฟล์สำหรับ diff