File1:
123
234
345
456
File2:
123
234
343
758
Output yang diharapkan: File3:
TRUE
TRUE
FALSE
FALSE
jadi kode harus membandingkan dua file dan mencetak 'BENAR' jika cocok jika tidak maka akan mencetak 'SALAH' dalam file baru. Adakah yang bisa memberikan solusi untuk ini?
text-processing
awk
diff
Velu
sumber
sumber
diff
.comm
. Itu membuatnya mudah untuk membuat daftar baris yang memiliki kedua file yang sama atau unik untuk satu atau yang lain.comm
adalah membutuhkan input yang diurutkan. Terlepas dari kenyataan bahwa contoh dalam pertanyaan memang telah mengurutkan input, pertanyaan itu tidak pernah menegaskan bahwa ini adalah data aktual yang sedang digunakan dan tidak pernah mengatakan apa-apa tentang pemesanan data.nl
bergunacomm
untuk memaksakan pengurutan pada file.Jawaban:
Gunakan
diff
perintah sebagai berikut, dibash
atau shell lain yang mendukung<(...)
proses penggantian atau Anda dapat meniru seperti yang ditunjukkan di sini :Output akan menjadi:
--new-line-format='FALSE'$'\n
, cetakFALSE
jika baris berbeda dan dengan--old-line-format=''
kami menonaktifkan output jika baris berbeda untuk file1 yang dikenal sebagai file lama ke perintah berbeda (Kita bisa menukar ini juga, yang berarti bahwa salah satu dari mereka harus mencetak yangFALSE
lain harus dinonaktifkan.)--unchanged-line-format='TRUE'$'\n'
, cetakTRUE
jika garis-garisnya sama. yang$'\n'
C-gaya melarikan diri sintaks digunakan untuk mencetak baris baru setelah setiap output baris.sumber
Dengan asumsi file tidak mengandung karakter tab:
Ini digunakan
paste
untuk membuat dua kolom tab-dibatasi, dengan isi dari dua file di kolom mana pun. Theawk
perintah membandingkan dua kolom pada setiap baris dan mencetakTRUE
jika kolom yang sama dan sebaliknya cetakanFALSE
.sumber
Dengan asumsi kedua file memiliki jumlah baris yang sama:
Itu melakukan perbandingan numerik jika string untuk membandingkan adalah angka dan leksikal sebaliknya. Misalnya,
100
dan1.0e2
akan dianggap identik. Mengubahf2"" == $0
memaksa perbandingan leksikal dalam hal apa pun.Bergantung pada
awk
implementasinya, perbandingan leksikal akan dilakukan seolah-olah dengan menggunakanmemcmp()
(perbandingan byte-ke-byte) atau seolah-olah dengan menggunakanstrcoll()
(apakah kedua string mengurutkan yang sama dalam urutan pengumpulan lokal). Itu dapat membuat perbedaan di beberapa lokal di mana urutan tidak didefinisikan dengan benar untuk beberapa karakter, tidak pada semua input angka desimal seperti dalam sampel Anda.sumber
Python 3
Keluaran:
Jika Anda membutuhkan
TRUE
danFALSE
dalam huruf besar, ganti garis cetak dengan salah satu dari ini:sumber
import itertools
pertama, dan kemudian menggunakanitertools.izip
bukannyazip
. Kalau tidak, itu akan membaca kedua file ke memori, mungkin menggunakan terlalu banyak memori.Dalam
bash
, membaca dari setiap file dalam satuwhile
lingkaran, membandingkan garis baca dan mencetakTRUE
atau denganFALSE
tepat:Dua panggilan untuk
read
membaca dari file deskriptor 3 dan 4 masing-masing. File diarahkan ke ini dengan dua pengalihan input ke dalam loop.sumber
keluaran
sumber