วิธีลบบรรทัดที่ซ้ำกันใน textfile หลาย GB ขนาดใหญ่?


16

คำถามของฉันคล้ายกับคำถามนี้แต่มีข้อ จำกัด ที่แตกต่างกันสองข้อ:

  • ฉันมี\nรายการคำศัพท์ที่คั่นขนาดใหญ่- หนึ่งคำต่อบรรทัด ขนาดไฟล์มีตั้งแต่ 2GB ถึงใหญ่ถึง 10GB
  • ฉันต้องการลบบรรทัดที่ซ้ำกัน
  • กระบวนการอาจเรียงลำดับรายการในระหว่างการลบรายการที่ซ้ำกัน แต่ไม่จำเป็น
  • มีพื้นที่ว่างเพียงพอบนพาร์ติชันเพื่อเก็บ wordlist ใหม่ที่ไม่ซ้ำใคร

ฉันลองทั้งสองวิธีนี้แล้ว แต่พวกเขาทั้งสองล้มเหลวโดยไม่มีข้อผิดพลาดของหน่วยความจำ

sort -u wordlist.lst > wordlist_unique.lst
awk '!seen[$0]++' wordlist.lst > wordlist_unique.lst
awk: (FILENAME=wordlist.lst FNR=43601815) fatal: assoc_lookup: bucket-ahname_str: can't allocate 10 bytes of memory (Cannot allocate memory)

ฉันจะลองวิธีอื่นได้อย่างไร


ดูวิธีแก้ปัญหาโดยใช้ awk unix.stackexchange.com/a/30178/56820
ezdazuzena

คำตอบ:


18

ลองใช้การจัดเรียงด้วยตัวเลือก-o/ --output=FILEแทนการเปลี่ยนเส้นทางการส่งออก นอกจากนี้คุณยังอาจลองตั้งค่าbuffer-sizeด้วย/-S --buffer-size=SIZEนอกจากนี้ลอง/-s --stableและอ่าน man page มันให้ข้อมูลทั้งหมดที่ฉันให้

คำสั่งเต็มรูปแบบที่คุณสามารถใช้ได้ซึ่งอาจใช้ได้ผลกับสิ่งที่คุณกำลังทำอยู่:

sort -us -o wordlist_unique.lst wordlist.lst

คุณอาจต้องการอ่าน URL ต่อไปนี้:

http://www.gnu.org/s/coreutils/manual/html_node/sort-invocation.html

นั่นอธิบายอย่างละเอียดยิ่งกว่าการจัดเรียงหน้าคน


ขอบคุณสำหรับคำแนะนำน่าเสียดายที่การใช้ - เอาท์พุทยังไม่สามารถแก้ไขข้อผิดพลาดหน่วยความจำไม่เพียงพอ sort: write failed: /root/tmp/sortVxscLn: No space left on deviceเล่นที่ยังคงให้ฉัน ปัญหาน่ารำคาญเล็กน้อยที่ไม่ได้ล้มเหลวทันที ดูเหมือนว่าคุณต้องรอให้หน่วยความจำหมดก่อนจึงจะเกิดข้อผิดพลาด
greatwolf

8
@Victor T .: นั่นไม่ใช่ข้อผิดพลาดหน่วยความจำไม่เพียงพอ แต่เกิดข้อผิดพลาดพื้นที่ดิสก์ไม่เพียงพอ / root อยู่ในระบบไฟล์อื่นกับข้อมูลของคุณหรือไม่? ถ้าเป็นเช่นนั้นใช้ตัวเลือก -T / - ไดเร็กทอรีชั่วคราวsortเพื่อใช้ระบบไฟล์ที่มีพื้นที่ว่างมากขึ้น
camh

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