Ada dua file yang disebut "a.txt" dan "b.txt" keduanya memiliki daftar kata. Sekarang saya ingin memeriksa kata-kata mana yang ekstra dalam "a.txt" dan tidak dalam "b.txt" .
Saya membutuhkan algoritma yang efisien karena saya perlu membandingkan dua kamus.
linux
terminal
diff
file-comparison
Ali Imran
sumber
sumber
diff a.txt b.txt
tidak cukup?Jawaban:
jika Anda telah menginstal vim, coba ini:
atau
Anda akan menemukannya fantastis.
sumber
Sortir dan gunakan
comm
:comm
membandingkan (diurutkan) file input dan secara default menghasilkan tiga kolom: baris yang unik untuk a, baris yang unik untuk b, dan baris yang ada di keduanya. Dengan menentukan-1
,-2
dan / atau-3
Anda dapat menekan output yang sesuai. Karena itucomm -23 a b
daftar hanya entri yang unik untuk a. Saya menggunakan<(...)
sintaks untuk mengurutkan file dengan cepat, jika sudah diurutkan Anda tidak perlu ini.sumber
comm
lebih efisien karena ia melakukan pekerjaan dalam sekali jalan, tanpa menyimpan seluruh file dalam memori. Karena Anda menggunakan kamus yang kemungkinan besar sudah diurutkan, Anda bahkan tidak perlu melakukannyasort
. Penggunaangrep -f file1 file2
di sisi lain akan memuat keseluruhanfile1
ke dalam memori dan membandingkan setiap barisfile2
dengan semua entri tersebut, yang jauh lebih efisien. Ini sebagian besar berguna untuk yang kecil, tidak disortir-f file1
.\n
juga akan dimasukkan untuk melakukan perbandingan.Coba
sdiff
(man sdiff
)sumber
Anda dapat menggunakan
diff
alat di linux untuk membandingkan dua file. Anda dapat menggunakan --changed-kelompok format dan --unchanged-kelompok format pilihan untuk data filter diperlukan.Tiga opsi berikut dapat digunakan untuk memilih grup yang relevan untuk setiap opsi:
'% <' dapatkan baris dari FILE1
'%>' dapatkan baris dari FILE2
'' (string kosong) untuk menghapus baris dari kedua file.
sumber
Jika Anda lebih suka gaya keluaran diff
git diff
, Anda dapat menggunakannya dengan--no-index
flag untuk membandingkan file yang tidak ada dalam repositori git:Dengan menggunakan beberapa file dengan sekitar 200k string nama file di masing-masing, saya membandingkan (dengan
time
perintah bawaan) pendekatan ini vs beberapa jawaban lain di sini:comm
tampaknya menjadi yang tercepat sejauh ini, sementaragit diff --no-index
tampaknya menjadi pendekatan tercepat untuk keluaran gaya-berbeda.Memperbarui 2018-03-25 Anda sebenarnya dapat menghilangkan
--no-index
flag kecuali jika Anda berada di dalam repositori git dan ingin membandingkan file yang tidak dilacak dalam repositori itu. Dari halaman manual :sumber
Anda juga dapat menggunakan: colordiff : Menampilkan output diff dengan warna.
Tentang vimdiff : Ini memungkinkan Anda untuk membandingkan file melalui SSH, misalnya:
Diambil dari: http://www.sysadmit.com/2016/05/linux-diferencias-entre-dos-archivos.html
sumber
Juga, jangan lupa tentang mcdiff - Penampil diff internal GNU Midnight Commander .
Sebagai contoh:
Nikmati!
sumber
Gunakan
comm -13
(memerlukan file yang diurutkan) :sumber
Ini solusi saya untuk ini:
sumber
sdiff -s file1 file2
bermanfaat.Menggunakan awk untuk itu. File uji:
Awk:
Duplikat dihasilkan:
Untuk menghindari duplikat, tambahkan setiap kata yang baru bertemu di a.txt ke
seen
hash:Keluaran:
Jika daftar kata dipisahkan dengan koma, seperti:
Anda harus melakukan beberapa putaran ekstra (
for
putaran):Keluarkan saat ini:
sumber