Menyebarkan dua file teks besar

32

Saya memiliki dua file besar (masing-masing 6GB). Mereka tidak disortir, dengan umpan baris ( \n) sebagai pemisah. Bagaimana saya bisa membedakan mereka? Itu harus di bawah 24 jam.

Jonasl
sumber

Jawaban:

45

Jawaban yang paling jelas adalah hanya menggunakan perintah diff dan mungkin ide yang bagus untuk menambahkan parameter --speed-large-files ke dalamnya.

diff --speed-large-files a.file b.file

Anda menyebutkan file yang tidak disortir jadi mungkin Anda perlu mengurutkan file terlebih dahulu

sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted

Anda bisa menghemat membuat file output tambahan dengan memipis jenis output 2 langsung ke diff

sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -

Jelas ini akan berjalan paling baik pada sistem dengan banyak memori yang tersedia dan Anda kemungkinan akan membutuhkan banyak ruang disk juga.

Tidak jelas dari pertanyaan Anda apakah Anda pernah mencobanya sebelumnya. Jika demikian maka akan sangat membantu untuk mengetahui apa yang salah (terlalu lama dll.). Saya selalu menemukan bahwa perintah stock sort dan diff cenderung melakukan setidaknya serta perintah kustom kecuali ada beberapa properti domain yang sangat spesifik dari file yang memungkinkan untuk melakukan sesuatu secara berbeda.

Richm
sumber
2
+1. Anda dapat menghapus semua file sementara dengan pipa bernama. Gunakan mkfifountuk membuat [ab].file.sortedsebelum menggunakannya sebagai output untuk sort. Letakkan keduanya sortdengan &di latar belakang dan gunakan kedua piped sebagai nama file untuk diff.
krissi
15
@krissi Anda juga dapat mencapai efek yang sama menggunakan sintaks ini:diff <(command 1) <(command 2)
Michael Mrozek
Terima kasih berhasil. Saya membutuhkan beberapa GB memori tetapi 16GB Amazon EC2 memperbaikinya :)
jonasl
7
Jika seseorang seperti saya bertanya-tanya mengapa <(cmd1) <(cmd2)sintaks berfungsi (karena kedengarannya seperti mengarahkan ulang input standar dua kali!), Coba echo hello <(cmd1) <(cmd2). Anda akan melihat sesuatu hello /dev/fd/63 /dev/fd/62yang tiba-tiba membuatnya jelas;)
alex
3
Dalam pengalaman saya, --speed-large-filesopsi tidak membantu jika Anda tidak memiliki RAM yang cukup. Juga, pre-sorting tidak membantu jika Anda memiliki struktur catatan multi-baris yang ingin Anda pertahankan. Opsi yang disebutkan di atas (oleh @unhammer) menarik, tetapi output dari rdiffdan bsdiffagak biner. Menginstal bdiffdari Heirloom Toolbox terlihat seperti tugas dauning (membutuhkan Heirloom devtools, file header yang punah, ...). Apakah ini sepadan dengan usaha? Apakah ada alternatif lain?
Christian Pietsch
5

Menyortir input dan memberi tahu diffprogram tentang input yang disortir akan memberikan kecepatan besar. Saya tidak mengetahui adanya diffopsi seperti itu tetapi commmengasumsikan input yang diurutkan dan akan jauh lebih cepat jika cukup untuk keperluan Anda.

Karl
sumber
commbekerja sangat baik untuk ini, tidak pernah mendengarnya sebelumnya tetapi ternyata itu di coreutils.
theferrit32