Saya memiliki serangkaian file teks yang ingin saya ketahui garis-garisnya secara umum daripada garis-garis yang berbeda di antara mereka. Baris perintah unix atau windows baik-baik saja.
foo:
linux-vdso.so.1 => (0x00007fffccffe000)
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000)
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000)
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)
batang:
libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000)
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000)
linux-vdso.so.1 => (0x00007fffccffe000)
Jadi, mengingat kedua file ini di atas keluaran dari utilitas yang diinginkan akan mirip file1:line_number, file2:line_number == matching text
(hanya saran, saya benar-benar tidak peduli apa sintaksnya):
foo:1, bar:3 == linux-vdso.so.1 => (0x00007fffccffe000)
Terima kasih.
command-line
diff
matt wilkie
sumber
sumber
Jawaban:
Pada * nix, Anda dapat menggunakan comm . Jawaban pertanyaannya adalah:
Inilah penggunaan penuh dari
comm
:Perhatikan juga bahwa penting untuk menyortir file sebelum menggunakan comm, seperti yang disebutkan dalam halaman manual.
sumber
Menemukan jawaban ini pada pertanyaan yang terdaftar sebagai duplikat . Saya menemukan grep lebih ramah-admin daripada comm, jadi jika Anda hanya ingin set baris yang cocok (misalnya, berguna untuk membandingkan CSV) cukup gunakan
atau versi fgrep yang disederhanakan
Plus, Anda dapat menggunakan
file2*
glob dan mencari garis yang sama dengan banyak file, bukan hanya dua.Beberapa variasi berguna lainnya termasuk
-n
tandai untuk menunjukkan nomor baris dari setiap baris yang cocok-c
untuk hanya menghitung jumlah garis yang cocok-v
untuk menampilkan hanya baris dalam file2 yang berbeda (atau digunakandiff
).Menggunakan
comm
lebih cepat, tetapi kecepatan itu datang dengan mengorbankan harus mengurutkan file Anda terlebih dahulu. Ini tidak terlalu berguna sebagai 'reverse diff'.sumber
-v
bendera setelah saya menyelinap sendiri. Katakanlah Anda memiliki dua file csv, file1 dan file2, dan keduanya memiliki baris yang tumpang tindih dan yang tidak tumpang tindih. Jika Anda menginginkan semua dan hanya baris yang tidak tumpang tindih, menggunakanfgrep -v file1 file2
hanya akan mengembalikan baris yang tidak tumpang tindih dalam file2, dan tidak ada baris tambahan yang tidak tumpang tindih dalam file1 . Ini mungkin jelas bagi sebagian orang, tetapi lebih baik menyatakan kesalahan interpretasi yang jelas daripada risiko. Dalam kasus khusus ini, menyortir file dan menggunakancomm
masih merupakan pilihan yang lebih baik.grep
: setiap baris kosong di file pertama akan cocok dengan setiap baris di file kedua. Pastikanfile1
tidak memiliki garis kosong, atau akan terlihat file-file tersebut identik.grep -Fxf
ini untukku.Ditanyakan di sini sebelumnya: Perintah Unix untuk menemukan baris yang umum dalam dua file
Anda juga dapat mencoba dengan perl (kredit diberikan di sini )
sumber
comm
tidak tersedia. Ini adalah alternatif yang sempurna.Saya baru belajar perintah comm dari utas ini, tetapi ingin menambahkan sesuatu: jika file tidak diurutkan, dan Anda tidak ingin menyentuh file asli, Anda dapat mem-pipe outptut dari perintah sortir. Ini membiarkan file asli tetap utuh. Bekerja di bash, saya tidak bisa mengatakan tentang kerang lainnya.
Ini dapat diperluas untuk membandingkan output perintah, bukan file:
sumber
Cara termudah untuk dilakukan adalah:
File tidak perlu disortir.
sumber
Sekedar informasi, saya membuat alat kecil untuk Windows melakukan hal yang sama dari "grep -F -x -f file1 file2" (Karena saya belum menemukan sesuatu yang setara dengan perintah ini pada Windows)
Ini dia: http://www.nerdzcore.com/?page=commonlines
Penggunaan adalah "CommonLines inputFile1 inputFile2 outputFile"
Kode sumber juga tersedia (GPL)
sumber
Di Windows Anda dapat menggunakan Powershell Script dengan CompareObject
BandingkanObjek:
sumber