İki metin dosyasının (diff'in tersi) ortak satırlarını (benzerlikleri) çıktı?


21

Diff iki dosya arasındaki değişiklikleri görüntülemek için harika bir araçtır. Ancak iki metin dosyasının benzerliklerini nasıl görüntüleyebilirim (farklılıkları yok sayarak)?

Yani örnek girişi:

a:
Foo Bar
X
Hello
World
42

b:
Foo Baz
Hello
World
23

Sözde çıktı (böyle bir şey):

@@ 2,3
=Hello World

Her iki dosyayı sıralamak ve comm kullanmak yeterli değildir, çünkü bu durumda satır bilgileri kaybolur.

Yanıtlar:


24

Fark istemeseniz de fark kullanmaya ne dersiniz? Bunu dene:

diff --unchanged-group-format='@@ %dn,%df 
  %<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt

Örnek verilerinizle elde ettiklerim:

$ cat a.txt 
Foo Bar
X
Hello
World
42
$ cat b.txt 
Foo Baz
Hello
World
23
$ diff --unchanged-group-format='@@ %dn,%df
%<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt
@@ 2,3
Hello
World

2
Bunun gibi bir gerçek satırsonu yerleştirmekten kaçınabilirsiniz:...%df'$'\n''%<'...
sonraki duyuruya kadar duraklatıldı.

1
Bunu şu şekilde de yapabilirsiniz: ... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ...(Çift tırnaklara dikkat edin.)
sonraki duyuruya kadar duraklatıldı.

Harika şeyler! Bu seçenekleri bilmiyordum, çünkü sadece diff man sayfasına baktım ...
maxschlepzig

Diff --version diff (GNU diffutils) 2.8.1 kullanıyorum ve aşağıdaki hatayı alıyorum: diff: çakışan çıktı stili seçenekleri diff: Daha fazla bilgi için `` diff --help '' komutunu deneyin.
Sujay

Tanımlanmış bir fark takma adı vardı çünkü "hata: diff: çakışan çıktı stili seçenekleri diff" alıyordum. which diffSorunun bu olup olmadığını görmek için kullanın .
justinjhendrick

14
grep -Fxf file1 file2

-Fdüz dizeleri eşleştir (regexps ile değil), -xyalnızca tam satır eşleşmeleri -fanlamına gelir, bağımsız değişken olarak adlandırılan dosyadan 'desenler' (yani satırlar) al


3
Değil -fve -Fdeğiş tokuş? En azından grepversiyonumda böyle. Benim gibi argüman file2girdi sağlamak gerekir , ve sonra çalışır. -fcat file1 | grep -Fxf file2
Birei

Bu benim için işe yaramadı.
Chaminda Bandara

7

comm kullanılabilir. man commtüm seçenekler için kullanılabilir comm -12 ..., ancak yalnızca her iki girişte de var olan satırları göstermek için kullanabilirsiniz .

İnsanların işaret ettiği gibi, önce girdinizi iletmeniz gerekir sort.


1
Hm, yalnızca her iki dosyada da aynı satır numarasındaki ortak satırlar için çalışır.
maxschlepzig

2
comm, yalnızca sıralı dosyalar içindir ve OP'nin kullanıcı tabanı için bu yararlı çıktıyı vermemektedir. Onun örneği: $ comm -12 ab Merhaba Dünya comm: dosya 1 sıralı sıra değil comm: dosya 2 sıralı değil
Marcel Stimberg

@maxschlepzig: Dosyalarınızı comm'ye geçirmeden önce sıralamanız gerekir.
Hemant

2
Bununla birlikte, sıralayarak, ortak hatların konumu hakkındaki tüm bilgilerden kurtulursunuz. Farkları karşılaştırmadan önce dosyaları sıralamazsınız.
Marcel Stimberg

7

Yapmasını istediğiniz şeyi yapan tek bir komut olduğunu düşünmüyorum. Bununla diffbirlikte grep, çıktısını birleştirmeyi deneyebilirsiniz . Metin dosyaları karakterlerin hiçbiri içeriyorsa |, <, >, şu size biraz kullanışlı çıktıyı verir:

$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello                             Hello
4:World                             World

Bunu deneyin:diff --width=155 --left-column --side-by-side a b | grep -n -v '|' | sed 's/ *($//'
sonraki duyuruya kadar duraklatıldı.

daha iyi görünüyor - ancak her iki dosyaya da eklenen satırlardan kurtulmak için grep'e <ve> eklemeniz gerekir.
Marcel Stimberg

2

Dick Grune bu tür bir araç için bir aile ailesi yazdı:

http://dickgrune.com/Programs/similarity_tester/

Çeşitli dillerin sözdizimini ayrıştıran sürümler vardır, böylece yeniden adlandırılmış değişkenler gibi şeyler değişmemiş olarak görülebilir.

similarity-testerDebian ve Ubuntu'da olduğu gibi paketlenmiştir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.