Jadi pada dasarnya yang ingin saya lakukan adalah membandingkan dua file dengan baris demi kolom 2. Bagaimana saya bisa mencapai ini?
File_1.txt:
User1 US
User2 US
User3 US
File_2.txt:
User1 US
User2 US
User3 NG
Berkas keluaran:
User3 has changed
command-line
text-processing
Roboman1723
sumber
sumber
diff "File_1.txt" "File_2.txt"
Jawaban:
Lihatlah
diff
perintahnya. Ini alat yang bagus, dan Anda bisa membacanya dengan mengetik diman diff
terminal Anda.Perintah yang ingin Anda lakukan adalah
diff File_1.txt File_2.txt
yang akan menampilkan perbedaan antara keduanya dan akan terlihat seperti ini:Catatan singkat tentang membaca output dari perintah ketiga: 'Panah' (
<
dan>
) merujuk pada nilai baris di file kiri (<
) vs file kanan (>
), dengan file kiri menjadi yang Anda masukkan pertama di baris perintah, dalam hal iniFile_1.txt
Selain itu, Anda mungkin melihat perintah ke-4 adalah
diff ... | tee Output_File
ini mem-pipe hasil daridiff
menjaditee
, yang kemudian menempatkan output itu ke dalam file, sehingga Anda dapat menyimpannya untuk nanti jika Anda tidak ingin melihat semuanya di konsol saat itu juga.sumber
diff file1 file2 -s
. Berikut ini contohnya: imgur.com/ShrQx9xAtau Anda dapat menggunakan Meld Diff
Instal dengan menjalankan:
Contoh Anda:
Bandingkan direktori:
Contoh dengan teks lengkap:
sumber
Anda dapat menggunakan vimdiff .
Contoh:
sumber
dos
dan yang kedua diunix
.FWIW, saya lebih suka apa yang saya dapatkan dengan output berdampingan dari diff
akan memberikan sesuatu seperti:
sumber
Anda dapat menggunakan perintah
cmp
:output akan menjadi
sumber
cmp
jauh lebih cepat daripadadiff
jika semua yang Anda inginkan adalah kode pengembalian.Meld
adalah alat yang sangat hebat. Tetapi Anda juga dapat menggunakandiffuse
untuk membandingkan dua file secara visual:sumber
Litteraly menempel pada pertanyaan (file1, file2, outputfile dengan pesan "telah berubah") skrip di bawah ini berfungsi.
Salin skrip ke file kosong, simpan sebagai
compare.py
, buat dapat dieksekusi, jalankan dengan perintah:Naskah:
Dengan beberapa baris tambahan, Anda dapat membuatnya mencetak ke file output, atau ke terminal, tergantung pada apakah file output didefinisikan:
Untuk mencetak ke file:
Untuk mencetak ke jendela terminal:
Naskah:
sumber
Cara mudah adalah menggunakan
colordiff
, yang berperilaku sepertidiff
tetapi mewarnai hasilnya. Ini sangat membantu untuk membaca perbedaan. Menggunakan contoh Anda,di mana
u
opsi memberikan diff terpadu. Ini adalah bagaimana diff berwarna ini terlihat seperti:Instal
colordiff
dengan menjalankansudo apt-get install colordiff
.sumber
Jawaban tambahan
Jika tidak perlu tahu bagian file yang berbeda, Anda dapat menggunakan checksum file. Ada banyak cara untuk melakukannya, menggunakan
md5sum
atausha256sum
. Pada dasarnya, masing-masing dari mereka menampilkan string yang hash isi file. Jika kedua file itu sama, hash mereka juga akan sama. Ini sering digunakan ketika Anda mengunduh perangkat lunak, seperti gambar instalasi iso Ubuntu. Mereka sering digunakan untuk memverifikasi integritas konten yang diunduh.Pertimbangkan skrip di bawah ini, tempat Anda dapat memberikan dua file sebagai argumen, dan file tersebut akan memberi tahu Anda apakah keduanya sama atau tidak.
Contoh dijalankan:
Jawaban yang lebih tua
Selain itu ada
comm
perintah, yang membandingkan dua file yang diurutkan, dan memberikan output dalam 3 kolom: kolom 1 untuk item unik ke file # 1, kolom 2 untuk item unik untuk file # 2, dan kolom 3 untuk item yang ada di kedua file.Untuk menekan salah satu kolom, Anda dapat menggunakan sakelar -1, -2, dan -3. Menggunakan -3 akan menunjukkan garis yang berbeda.
Di bawah ini Anda dapat melihat tangkapan layar dari perintah yang sedang beraksi.
Hanya ada satu persyaratan - file harus diurutkan agar dapat dibandingkan dengan benar.
sort
perintah dapat digunakan untuk tujuan itu. Di bawah adalah screenshot lain, di mana file diurutkan dan kemudian dibandingkan. Baris yang dimulai pada bellong kiri hanya untuk File_1, baris yang dimulai pada kolom 2 hanya milik File_2sumber
Instal git dan gunakan
Dan Anda akan mendapatkan output dalam format berwarna yang bagus
Instalasi git
sumber
colcmp.sh
Membandingkan pasangan nama / nilai dalam 2 file dalam format
name value\n
. Menulisname
untukOutput_file
jika diubah. Membutuhkan bash v4 + untuk array asosiatif .Pemakaian
Berkas keluaran
Sumber (colcmp.sh)
Penjelasan
Rincian kode dan apa artinya, sejauh yang saya mengerti. Saya menerima suntingan dan saran.
Bandingkan File Dasar
cmp akan menetapkan nilai $? sebagai berikut :
Saya memilih untuk menggunakan case .. pernyataan esac untuk evalute $? karena nilai $? berubah setelah setiap perintah, termasuk tes ([).
Atau saya bisa menggunakan variabel untuk menyimpan nilai $? :
Di atas melakukan hal yang sama dengan pernyataan kasus. IDK yang saya sukai lebih baik.
Bersihkan Output
Di atas menghapus file output jadi jika tidak ada pengguna yang berubah, file output akan kosong.
Saya melakukan ini di dalam pernyataan kasus sehingga Output_file tetap tidak berubah pada kesalahan.
Salin File Pengguna ke Shell Script
Di atas menyalin File_1.txt ke direktori home pengguna saat ini.
Misalnya, jika pengguna saat ini adalah john, di atas akan sama dengan cp "File_1.txt" /home/john/.colcmp.arrays.tmp.sh
Escape Karakter Khusus
Pada dasarnya, saya paranoid. Saya tahu bahwa karakter ini dapat memiliki arti khusus atau menjalankan program eksternal ketika dijalankan dalam skrip sebagai bagian dari penugasan variabel:
Yang saya tidak tahu adalah seberapa banyak saya tidak tahu tentang bash. Saya tidak tahu apa karakter lain yang mungkin memiliki makna khusus, tetapi saya ingin menghindarinya dengan backslash:
sed dapat melakukan lebih dari sekadar pencocokan pola ekspresi reguler . Pola skrip "s / (find) / (ganti) /" secara khusus melakukan kecocokan pola.
"s / (temukan) / (ganti) / (pengubah)"
dalam bahasa Inggris: tangkap tanda baca atau karakter khusus apa pun sebagai grup caputure 1 (\\ 1)
dalam bahasa Inggris: awali semua karakter khusus dengan garis miring terbalik
dalam bahasa Inggris: jika lebih dari satu kecocokan ditemukan pada baris yang sama, gantilah semuanya
Komentari Seluruh Script
Di atas menggunakan ekspresi reguler untuk mengawali setiap baris ~ / .colcmp.arrays.tmp.sh dengan karakter komentar bash ( # ). Saya melakukan ini karena nanti saya bermaksud untuk mengeksekusi ~ / .colcmp.arrays.tmp.sh menggunakan perintah sumber dan karena saya tidak tahu pasti seluruh format File_1.txt .
Saya tidak ingin secara tidak sengaja mengeksekusi kode arbitrer. Saya tidak berpikir ada yang melakukannya.
"s / (temukan) / (ganti) /"
dalam bahasa Inggris: tangkap setiap baris sebagai grup caputure 1 (\\ 1)
dalam bahasa Inggris: ganti setiap baris dengan simbol pound diikuti dengan garis yang diganti
Konversi Nilai Pengguna ke A1 [Pengguna] = "nilai"
Di atas adalah inti dari skrip ini.
#User1 US
A1[User1]="US"
A2[User1]="US"
(untuk file ke-2)"s / (temukan) / (ganti) /"
dalam Bahasa Inggris:
tangkap sisa baris sebagai grup tangkap 2
(ganti) = A1 \\ [\\ 1 \\] = \ "\\ 2 \"
A1[
untuk memulai penugasan array dalam sebuah array bernamaA1
]="
]
= tugas array dekat misalnyaA1[
User1]="
US"
=
= operator penugasan misalnya variabel = nilai"
= nilai kutipan untuk menangkap spasi ... walaupun sekarang saya berpikir tentang hal itu, akan lebih mudah untuk membiarkan kode di atas yang backslash semuanya untuk juga karakter backslash spasi.dalam bahasa Inggris: ganti setiap baris dalam format
#name value
dengan operator penugasan array dalam formatA1[name]="value"
Jadikan Dapat Dieksekusi
Di atas menggunakan chmod untuk membuat file skrip array dapat dieksekusi.
Saya tidak yakin apakah ini perlu.
Deklarasikan Array Asosiatif (bash v4 +)
Capital -A menunjukkan bahwa variabel yang dideklarasikan akan menjadi array asosiatif .
Inilah sebabnya mengapa skrip membutuhkan bash v4 atau lebih tinggi.
Jalankan Script Assignment Variable Assignment kami
Kita sudah:
User value
ke barisA1[User]="value"
,Di atas kami sumber script untuk menjalankannya di shell saat ini Kami melakukan ini agar kami dapat menyimpan nilai variabel yang ditetapkan oleh skrip. Jika Anda menjalankan skrip secara langsung, itu memunculkan shell baru, dan nilai-nilai variabel hilang ketika shell baru keluar, atau setidaknya itu adalah pemahaman saya.
Ini Seharusnya Berfungsi
Kami melakukan hal yang sama untuk $ 1 dan A1 yang kami lakukan untuk $ 2 dan A2 . Itu benar-benar harus menjadi fungsi. Saya pikir pada titik ini skrip ini cukup membingungkan dan berfungsi, jadi saya tidak akan memperbaikinya.
Deteksi Pengguna Dihapus
Di atas loop melalui kunci array asosiatif
Di atas menggunakan substitusi variabel untuk mendeteksi perbedaan antara nilai yang tidak disetel vs variabel yang telah secara eksplisit diatur ke string panjang nol.
Rupanya, ada banyak cara untuk melihat apakah suatu variabel telah ditetapkan . Saya memilih satu dengan suara terbanyak.
Di atas menambahkan pengguna $ i ke Output_File
Deteksi Pengguna Ditambahkan atau Diubah
Di atas menghapus variabel sehingga kami dapat melacak pengguna yang tidak berubah.
Di atas loop melalui kunci array asosiatif
Di atas menggunakan substitusi variabel untuk melihat apakah suatu variabel telah ditetapkan .
Karena $ i adalah kunci array (nama pengguna) $ A2 [$ i] harus mengembalikan nilai yang terkait dengan pengguna saat ini dari File_2.txt .
Misalnya, jika $ i adalah User1 , yang di atas berbunyi $ {A2 [User1]}
Di atas menambahkan pengguna $ i ke Output_File
Karena $ i adalah kunci array (nama pengguna) $ A1 [$ i] harus mengembalikan nilai yang terkait dengan pengguna saat ini dari File_1.txt , dan $ A2 [$ i] harus mengembalikan nilai dari File_2.txt .
Di atas membandingkan nilai yang terkait untuk pengguna $ i dari kedua file ..
Di atas menambahkan pengguna $ i ke Output_File
Di atas membuat daftar pengguna yang dipisahkan koma dan tidak berubah. Perhatikan tidak ada spasi dalam daftar, atau cek berikutnya perlu dikutip.
Di atas melaporkan nilai $ USERSWHODIDNOTCHANGE tetapi hanya jika ada nilai dalam $ USERSWHODIDNOTCHANGE . Cara ini ditulis, $ USERSWHODIDNOTCHANGE tidak boleh berisi spasi. Jika memang membutuhkan spasi, di atas dapat ditulis ulang sebagai berikut:
sumber