Pertanyaan ini sudah ada jawabannya di sini:
Saya memiliki file teks yang sangat besar (> 50 GB), tetapi sebagian besar baris adalah duplikat, jadi saya ingin menghapusnya. Apakah ada cara untuk menghapus garis duplikat dari file, dan menangani file> 2GB? Karena setiap metode yang saya temukan sampai sekarang hanya dapat berfungsi pada file kecil.
uniq
adalah teman Anda, karena itu tidak perlu. Jika duplikat sebagian besar berturut-turut, Anda masih dapat menggunakanuniq
untuk memproses ulang file untuk disortir.Jawaban:
Dengan asumsi semua baris lebih pendek dari 7kB, dan bahwa Anda memiliki bash, dd, tail, head, sed, dan sortir yang diinstal dari cygwin / unix:
Ini membagi file dalam potongan 1024000 byte, dan menambahkan juga 3 * 7 * 1024 byte ("21" in
1021
) dari potongan berikutnya. Karena divisi dapat memotong satu baris, baris pertama (1d
) dan terakhir ($d
) dari masing-masing bilah dihancurkan (sed
).Jadi sebagai kompensasi, sesuatu yang mengandung potongan terakhir diekstraksi lagi dan hanya baris terakhirnya yang disimpan (ekor -n 1), dan baris pertama juga diekstraksi lagi (kepala -n 1).
Ketika loop gagal, potongan terakhir telah diekstraksi.
sort -u
dapat dilihat sebagai kompresor, tetapi hanya memilah inputnya kemudian melewati duplikat. "Sortir" pertama mengkompres semua potongan. Yang keduasort
kompres lagi concatenations semua potongan ini (dan yang keduasort
telah hilang dari kode di atas sejak edit ketiga, maaf).Anda mengatakan file teks, tapi saya asumsikan biner, karena itu
LANG=
(jadi lebih cepat juga).sumber
for i=`seq 50000`
tidak akan bekerja pada shell * nix apa pun yang saya tahu, maksud Andafor i in $(seq 50000)
? Bisakah Anda juga menambahkan beberapa penjelasan tentang apa yang Anda lakukan? Anda menggunakan beberapa trik bagus di sini, tetapi jangan memberi tahu OP apa itu atau bagaimana cara kerjanya./usr/bin/seq 4
; lakukan echo $ i; selesaifor i=`seq 4`
tidak setara denganfor i in `seq 4`
. Saya telah mengedit jawaban Anda sekarang karena saya tahu ini bukan fitur shell windows yang aneh. Ini benar-benar akan menjadi jawaban yang bagus jika Anda ingin menambahkan penjelasan tentang apa yang dilakukannya. Trik Anda membaca file dalam blok untuk menghilangkan beberapa dupes sebelum menyortir untuk menyingkirkan sisanya adalah ide bagus tetapi sangat sulit untuk dipahami jika Anda tidak fasih dengan alat yang Anda gunakan.sort
dan didokumentasikan pada akhir posting saya, yang menghapus dupes dari potongan yang berbeda. Ini adalah kesalahan dari hasil edit saya sebelumnya, maaf: itu hanya menghapus dupes yang berakhir pada potongan yang sama, seperti yang ditunjukkan oleh Loren Pechtel.Jalankan instance linux di AWS / GCE, dan gunakan 'uniq'. OSX memilikinya juga ...
Documents di sini: http://www.thegeekstuff.com/2013/05/uniq-command-examples/
sumber