it-swarm.asia

Yalnızca eklenen ve silinen satırları göstermek için farkımı nasıl alabilirim? Diff yapamazsa, hangi araç yapabilir?

Yalnızca eklenen ve silinen satırları göstermek için farkımı nasıl alabilirim? Diff yapamazsa, hangi araç yapabilir?

71
C. Ross

Comm'u deneyin

Bakmanın başka bir yolu:

  • Yalnızca a dosyasında var olan satırları göster: (yani a'dan silinenler)

    comm -23 a b
    
  • Yalnızca b dosyasında var olan satırları göster: (yani b'ye eklenenler)

    comm -13 a b
    
  • Yalnızca bir dosyada veya diğerinde bulunan satırları göster: (ancak her ikisinde birden değil)

    comm -3 a b | sed 's/^\t//'
    

(Uyarı: a dosyasında SEKME ile başlayan satırlar varsa, dosya (ilk SEKME) çıktıdan kaldırılır.)

Yalnızca sıralanan dosyalar

NOT: Düzgün çalışması için her iki dosyanın da comm için sıralanması gerekir. Zaten sıralanmamışlarsa, bunları sıralamanız gerekir:

sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted

Dosyalar çok uzunsa, fazladan bir kopya ve dolayısıyla iki kat daha fazla disk alanı gerektirdiğinden bu oldukça büyük bir yük olabilir.

85
TomOnTime

comm istediğinizi yapabilir. Man sayfasından:

AÇIKLAMA

Sıralanan FILE1 ve FILE2 dosyalarını satır satır karşılaştırır.

Seçenek olmadan üç sütunlu çıktı üretin. Birinci sütun FILE1'e özgü satırlar, ikinci sütun FILE2'ye özgü satırlar içerir ve üçüncü sütun her iki dosya için ortak satırlar içerir.

Bu sütunlar -1, -2 ve -3 sırasıyla.

Misal:

[[email protected] ~]# cat a
common
shared
unique

[[email protected] ~]# cat b
common
individual
shared

[[email protected] ~]# comm -3 a b
    individual
unique

Ve sadece benzersiz satırları istiyorsanız ve hangi dosyada olduklarını umursamıyorsanız:

[[email protected] ~]# comm -3 a b | sed 's/^\t//'
individual
unique

Kılavuz sayfasının dediği gibi, dosyalar önceden sıralanmalıdır.

15
markdrayton

Bağlam, satır numarası, +, -, <,> olmadan ekleme ve silme işlemlerini göstermek için! vb, fark şöyle kullanabilirsiniz:

diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt 

Örneğin, iki dosya verildi:

a.txt

Common
Common
A-ONLY
Common

b.txt

Common
B-ONLY
Common
Common

Aşağıdaki komut, a'dan kaldırılan veya b'ye eklenen satırları gösterir:

diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt 

çıktı:

B-ONLY
A-ONLY

Bu biraz farklı komut a.txt dosyasından kaldırılan satırları gösterir:

diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt 

çıktı:

A-ONLY

Son olarak, bu komut a.txt dosyasına eklenen satırları gösterir

diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt 

çıktı

B-ONLY
10
iphonedroid

Varsayılan olarak fark budur ... Belki boşlukları yok saymak için bazı bayraklar eklemeniz gerekir?

diff -b -B

boş satırları ve farklı sayıda alanı görmezden gelmelidir.

2
Scott Lundberg

Hayır, diff aslında iki dosya arasındaki farklılıkları düşünme biçiminde göstermiyor. Bir dosyayı diğerine değiştirmek için kullanmak üzere patch gibi bir araç için bir dizi düzenleme komutu üretir.

Aradığınızı yapmaya yönelik herhangi bir girişimin zorluğu, silinmiş bir çizgiye ve ardından eklenen bir çizgiye göre neyin değiştiğini nasıl tanımlayacağınızdır. Ayrıca, bitişik satırlar eklendiğinde, silindiğinde ve değiştirildiğinde ne yapmalı?.

Görsel karşılaştırma araçları, aynı sayıda satıra ancak farklı içeriğe sahip bir segmentin değiştirilmiş bir segment olarak kabul edilmesi için iki dosyayı birbirine sığdırır. Eşleşen segmentler arasındaki tamamen yeni satırlar, eklenen segmentler olarak kabul edilir.

Bu aynı zamanda bir terminaldeki iki dosyanın yan yana karşılaştırmasını gösteren sdiff komut satırı aracıdır. Değişen çizgiler | karakter. Yalnızca A dosyasında bir çizgi varsa, ayırıcı karakter olarak <kullanılır. Yalnızca B dosyasında bir çizgi varsa, ayırıcı olarak> kullanılır. Dosyalarda <ve> karakteri yoksa, yalnızca eklenen satırları göstermek için bunu kullanabilirsiniz:

sdiff A B | grep '[<>]'
2
Seppo Enarvi

Teşekkürler senarvi, çözümünüz (oy verilmedi) aslında bir ton sayfada yaş aradıktan sonra tam olarak istediğim şeyi verdi.

Cevabınızı kullanarak, değiştirilen/eklenen/silinen şeylerin listesini almak için geldim. Örnek,/etc/passwd dosyasının 2 sürümünü kullanır ve ilgili kayıtların kullanıcı adını yazdırır.

#!/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}'
2
geniosity

Bu formu sık sık yararlı buluyorum:

diff --changed-group-format='-%<+%>' --unchanged-group-format='' f g

Misal:

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

Çıktı:

-b
-c
+B
+C
-e
-f
+E
+F

Yani - ve hemen ardından +.

C silinmesine sahip olsaydık:

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

şuna benzer:

-b
+B
+C
-e
-f
+E
+F

Biçim man diff:

       --line-format=LFMT
              format all input lines with LFMT`

ve:

       LTYPE is 'old', 'new', or 'unchanged'.
              GTYPE is LTYPE or 'changed'.

ve:

              LFMT (only) may contain:

       %L     contents of line

       %l     contents of line, excluding any trailing newline

       [...]

İlgili soru: https://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux

Ubuntu 18.04'te test edildi.