Bagaimana saya bisa mendapatkan diff untuk hanya menampilkan baris yang ditambahkan dan dihapus? Jika diff tidak bisa melakukannya, alat apa yang bisa?
diff A B | grep '^[<>]'
comm
.
Bagaimana saya bisa mendapatkan diff untuk hanya menampilkan baris yang ditambahkan dan dihapus? Jika diff tidak bisa melakukannya, alat apa yang bisa?
diff A B | grep '^[<>]'
comm
.
Jawaban:
Cara lain untuk melihatnya:
Tampilkan baris yang hanya ada di file a: (yaitu apa yang dihapus dari a)
comm -23 a b
Tampilkan baris yang hanya ada di file b: (yaitu apa yang ditambahkan ke b)
comm -13 a b
Tampilkan baris yang hanya ada di satu file atau yang lain: (tetapi tidak keduanya)
comm -3 a b | sed 's/^\t//'
(Peringatan: Jika file a
memiliki baris yang dimulai dengan TAB, itu (TAB pertama) akan dihapus dari output.)
CATATAN: Kedua file harus disortir comm
agar berfungsi dengan benar. Jika belum diurutkan, Anda harus mengurutkannya:
sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted
Jika file sangat panjang, ini mungkin cukup membebani karena memerlukan salinan tambahan dan karenanya ruang disk dua kali lebih banyak.
comm -12 <(sort a) <(sort b)
comm
mungkin melakukan apa yang Anda inginkan. Dari halaman manualnya:
DESKRIPSI
Bandingkan file yang diurutkan FILE1 dan FILE2 baris demi baris.
Tanpa opsi, hasilkan output tiga kolom. Kolom satu berisi baris unik untuk FILE1, kolom dua berisi baris unik untuk FILE2, dan kolom tiga berisi baris yang umum untuk kedua file.
Kolom-kolom ini dapat ditekan dengan -1
, -2
dan -3
masing - masing.
Contoh:
[root@dev ~]# cat a
common
shared
unique
[root@dev ~]# cat b
common
individual
shared
[root@dev ~]# comm -3 a b
individual
unique
Dan jika Anda hanya ingin baris unik dan tidak peduli file mana yang ada di dalamnya:
[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique
Seperti yang dikatakan halaman manual, file harus disortir terlebih dahulu.
Untuk menampilkan penambahan dan penghapusan tanpa konteks, nomor baris, +, -, <,>! dll, Anda dapat menggunakan diff seperti ini:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
Misalnya, diberikan dua file:
a.txt
Common
Common
A-ONLY
Common
b.txt
Common
B-ONLY
Common
Common
Perintah berikut akan menunjukkan baris yang dihapus dari a atau ditambahkan ke b:
diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt
keluaran:
B-ONLY
A-ONLY
Perintah yang sedikit berbeda ini akan menampilkan baris yang dihapus dari a.txt:
diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt
keluaran:
A-ONLY
Akhirnya, perintah ini akan menampilkan baris yang ditambahkan ke a.txt
diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt
keluaran
B-ONLY
Itulah yang dilakukan diff secara default ... Mungkin Anda perlu menambahkan beberapa flag untuk mengabaikan spasi putih?
diff -b -B
harus mengabaikan garis kosong dan jumlah spasi yang berbeda.
Tidak, diff
sebenarnya tidak menunjukkan perbedaan antara dua file dengan cara yang mungkin orang pikirkan. Ini menghasilkan urutan perintah pengeditan untuk alat yang ingin patch
digunakan untuk mengubah satu file menjadi yang lain.
Kesulitan untuk setiap upaya melakukan apa yang Anda cari adalah bagaimana mendefinisikan apa yang merupakan garis yang telah berubah versus yang dihapus diikuti oleh yang ditambahkan. Juga apa yang harus dilakukan ketika baris ditambahkan, dihapus dan diubah berdekatan satu sama lain.
diff
sumber - sumbernya, tapi sepertinya saya ingat segala macam perputaran untuk melacak di mana dua file cocok untuk tetap selaras dan saya pikir ada ambang batas untuk menyerah berdasarkan seberapa jauh jaraknya. garis adalah. Tapi saya tidak ingat ada pencocokan intra-line kecuali untuk (putih) runtuh ruang kosong atau mengabaikan case. Atau (mungkin) kata-kata yang mempengaruhi itu. Bagaimanapun, ini semua tentang patch
dan "vgrep" hanya datang untuk perjalanan. Mungkin. Pada hari Selasa.
Alat perbandingan visual menyatukan dua file sehingga satu segmen dengan jumlah garis yang sama tetapi konten yang berbeda akan dianggap sebagai segmen yang diubah. Baris yang sepenuhnya baru antara segmen yang cocok dianggap sebagai segmen yang ditambahkan.
Ini juga merupakan cara alat baris perintah sdiff bekerja, yang menunjukkan perbandingan dua file secara berdampingan di terminal. Garis yang diubah dipisahkan oleh | karakter. Jika garis hanya ada di file A, <digunakan sebagai karakter pemisah. Jika garis hanya ada di file B,> digunakan sebagai pemisah. Jika Anda tidak memiliki karakter <dan> dalam file, Anda dapat menggunakan ini untuk hanya menampilkan baris yang ditambahkan:
sdiff A B | grep '[<>]'
Terima kasih senarvi, solusi Anda (tidak memilih) benar-benar memberi saya PERSIS apa yang saya inginkan setelah mencari usia pada satu ton halaman.
Dengan menggunakan jawaban Anda, inilah yang saya pikirkan untuk mendapatkan daftar hal-hal yang diubah / ditambahkan / dihapus. Contoh ini menggunakan 2 versi file / etc / passwd dan mencetak nama pengguna untuk catatan yang relevan.
#!/bin/bash
sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}'
sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}'
sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'
Saya menemukan bentuk khusus ini sering berguna:
diff --changed-group-format='-%<+%>' --unchanged-group-format='' f g
Contoh:
printf 'a\nb\nc\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
--new-line-format=$'+%l\n' \
--unchanged-line-format='' \
f g
Keluaran:
-b
-c
+B
+C
-e
-f
+E
+F
Jadi itu menunjukkan baris lama dengan -
diikuti segera oleh baris baru yang sesuai dengannya +
.
Jika kami memiliki penghapusan C
:
printf 'a\nb\nd\ne\nf\ng\n' > f
printf 'a\nB\nC\nd\nE\nF\ng\n' > g
diff --old-line-format=$'-%l\n' \
--new-line-format=$'+%l\n' \
--unchanged-line-format='' \
f g
terlihat seperti ini:
-b
+B
+C
-e
-f
+E
+F
Formatnya didokumentasikan di man diff
:
--line-format=LFMT
format all input lines with LFMT`
dan:
LTYPE is 'old', 'new', or 'unchanged'.
GTYPE is LTYPE or 'changed'.
dan:
LFMT (only) may contain:
%L contents of line
%l contents of line, excluding any trailing newline
[...]
Pertanyaan terkait: https://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux
Diuji di Ubuntu 18.04.
File1:
text670_1
text067_1
text067_2
File2:
text04_1
text04_2
text05_1
text05_2
text067_1
text067_2
text1000_1
Menggunakan:
diff -y file1 file2
Ini menunjukkan dua kolom untuk file repetif.
Keluaran:
text670_1
> text04_1
> text04_2
> text05_1
> text05_2
text067_1 text67_1
text067_2 text67_2
> text1000_1