Dari baris perintah Linux / Unix / Mac:
sort file1 file2 | uniq -d | sort file2 - | uniq -u
Penjelasan:
Ini hanya mengembalikan baris-baris di file2 yang tidak persis cocok dengan baris apa pun di file1.
Tangga:
sort file1 file2
: Menggabungkan file1 dan file2 bersama-sama, mengurutkannya, dan mencetaknya ke stdout. Perhatikan bahwa duplikat akan terdaftar di baris yang berdekatan (dua kali berturut-turut) setelah pengurutan.
uniq -d
: Mengambil output dari perintah sebelumnya dan mencetak hanya baris yang merupakan duplikat .
sort file2 -
: Menggabungkan file2 asli dan output dari perintah sebelumnya (stdout, yang diwakili oleh nama file " -
"hyphen), dan mencetak hasilnya ke stdout. Selain itu, setiap item dalam file2 yang juga di file1 akan digandakan (terdaftar dua kali berturut-turut) di output.
uniq -u
: Mengambil output dari perintah sebelumnya dan hanya mencetak item yang tidak digandakan (dengan kata lain, hanya mencetak item yang tidak terdaftar dua kali berturut-turut).
Gotcha yang mungkin:
Ini mengasumsikan bahwa setiap baris yang diberikan dalam file1 sama persis baris yang sesuai dalam file2. Jika, misalnya, file1 dan file2 memiliki email yang sama tetapi dengan huruf besar berbeda; atau jika file1 memiliki nama "Jon Sampson" sementara file2 memiliki alamat email yang sama dengan nama "Jonathan Sampson", mereka tidak akan dianggap duplikat.
Anda dapat mengontrol ini dengan melakukan pra-pemrosesan file untuk menghapus semuanya kecuali alamat email, dan selanjutnya, kecilkan alamat emailnya. Perintah Unix cut
dan tr
dapat membantu dalam kasus ini. Atau Anda bisa beralih ke SQL untuk skenario yang lebih kompleks.
Ukuran file:
File 200.000 baris dan satu dari 12.000 baris tidak terlalu besar. Saya menghasilkan file dengan ukuran yang sama menggunakan /usr/share/dict/words
file di MacBook Pro saya dan menguji perintah di atas; butuh waktu kurang dari 5 detik untuk berjalan.
join
. Anda belajar sesuatu yang baru setiap hari.