Bagaimana cara menghapus duplikat baris dalam filefile multi-GB yang besar?

16

Pertanyaan saya mirip dengan pertanyaan ini tetapi dengan beberapa kendala yang berbeda:

  • Saya memiliki \ndaftar kata terbatas besar - satu kata per baris. Ukuran file berkisar dari 2GB hingga 10GB.
  • Saya perlu menghapus garis duplikat.
  • Proses dapat mengurutkan daftar selama menghapus duplikat tetapi tidak diperlukan.
  • Ada cukup ruang pada partisi untuk membuat daftar kata unik yang baru dikeluarkan.

Saya telah mencoba kedua metode ini tetapi keduanya gagal tanpa kesalahan memori.

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)

Pendekatan apa lagi yang bisa saya coba?

serigala besar
sumber
Lihatlah solusi menggunakan awk unix.stackexchange.com/a/30178/56820
ezdazuzena

Jawaban:

18

Coba gunakan sortir dengan opsi -o/ --output=FILEalih-alih mengarahkan ulang output. Anda juga dapat mencoba mengatur buffer-sizedengan -S/ --buffer-size=SIZE. Juga, coba -s/ --stable. Dan baca halaman manual, ia menawarkan semua info yang saya berikan.

Perintah lengkap yang dapat Anda gunakan yang mungkin bekerja untuk apa yang Anda lakukan:

sort -us -o wordlist_unique.lst wordlist.lst

Anda mungkin juga ingin membaca URL berikut:

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

Itu lebih menyeluruh menjelaskan semacam daripada halaman manual.

laebshade
sumber
terima kasih atas sarannya, sayangnya menggunakan --output masih tidak memperbaiki kesalahan memori. Menjalankan itu masih memberi saya sort: write failed: /root/tmp/sortVxscLn: No space left on device. Masalahnya agak menjengkelkan karena tidak langsung gagal. Sepertinya Anda harus menunggu hingga memori habis sebelum kesalahan keluar.
greatwolf
8
@ Viktor T .: Itu bukan kesalahan memori, tapi kesalahan ruang disk. Apakah / root pada sistem file yang berbeda dengan data Anda? Jika demikian, gunakan opsi -T / - direktori-temporer sortuntuk menggunakan sistem file dengan lebih banyak ruang kosong.
camh
@camh terima kasih sudah berhasil. Tidak menyadari bahwa Anda dapat menentukan buffer perantara mana yang akan digunakan.
greatwolf