Anahtarlı satırlı diff iki dosyanın sonucu aynı satırın iki kez eksik olduğunu söylüyor


28

Satırları sadece birbirinin müsaadesi olan ancak ürettiği çıktıyı elde edemeyen iki dosyadaki linux diff komutunu anlamaya çalışıyorum. Aşağıdaki üç komutu göz önünde bulundurun:

[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2 
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples

Birisi yukarıdaki şifreli çıktısını diff'den açıklayabilir mi?

  1. Neden çıktıda hiç "portakal" den bahsedilmiyor?
  2. Ne geliyor 1d0ve 2a2ortalama?

Bu cevaptan şunu anlıyorum :

"<", dosya2'de satırın eksik olduğu anlamına gelir ve ">", dosya1'de satırın eksik olduğu anlamına gelir.

AMA bu çıktıda portakalların neden eksik olduğunu açıklamıyor.


12
Çünkü orangesiki dosya arasındaki en büyük ortak bölüm, bu nedenle elde ettiğiniz şey, ikisi arasındaki farkları ifade etmenin en kısa yoludur.
Stéphane Chazelas

10
Ve daha fazla okunabilir çıktı istiyorsanız, sadece kullanın diff -u file1 file2. Buna "birleşik fark" formatı denir. Orijinal fark formatının çok kompakt olması gerekiyordu, ancak birleşik farkların çok daha okunaklı olması gerekiyordu.
godlygeek

4
@godlygeek Ordiff -y file1 file2
user80551

Yanıtlar:


27

Raporu anlamak için diff, kurallara aykırı olduğunu unutmayın; ilk dosyada ( file1) ikinci dosyadakiyle aynı değişiklikleri yapmak için hangi değişikliklerin yapılması gerektiğini açıklayın file2.

Spesifik olarak, din 1d0, delete anlamına gelir ve ain 2a2, add .

Böylece:

  • 1d0satır 1'in file1( apples) içinde silinmesi gerektiği anlamına gelir . 0içinde 1d0bunlar ikinci dosyasında (göründü olurdu nerede yollarla hat 0'dır file2onlar silindi edilmişti). Bu file2, file1(geriye doğru) olarak değiştirildiğinde , file10 satırından sonra satır 1 ekleyeceğiniz anlamına gelir file2.
  • 2a2araç, ikinci hat (ekleme orangesgelen) file2artık ikinci satıra file1(ilk satır silindikten sonra file1, oranges1 hattına bağlanmış)

ne 0de 1d0?
Geek

@Geek benim düzenlememi gör
kaos

1
@Geek Ama dikkatli olun, beyinde budakları yapabilir =)
kaos

Bu, gerçekten knot yapmaya başladı :-)
Geek

13

Bu dosyaları göz önünde bulundurun:

file1:

# cat file1
apples
pears
oranges
peaches

file2:

# cat file2
oranges
apples
peaches
ananas
banana

diffSiparişe göre verilen nasıl çalışır:

  1. diffhatlarının birinci blok okur file1ve file2eşit çizgiler bulmak ve denemeden:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      -------------------------------
    ->oranges    ->oranges
      peaches      apples
                   peaches
                   ananas
                   banana
    
  2. Şimdi her iki dosyada eşit olan tüm satırları atlayacaktır, bu sadece orangesbu durumda:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
      -------------------------------
    ->peaches    ->apples
                   peaches
                   ananas
                   banana
    
  3. Şimdi başka bir benzer satır kümesi bul ve farkları yazdır:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      -------------------------------
    ->peaches    ->peaches
                   ananas
                   banana
    
  4. Benzer satırları atla

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      peaches      peaches
      -------------------------------
    ->           ->ananas
                   banana
    
  5. Mümkünse özdeş satırları bulun ve farklılıkları yazdırın:

    line_file1    file1    line_file2    file2        differences on left (<) or right side (>)
             1    apples                              <apples 
             2    pears                               <pears 
             3    oranges           1    oranges
                                    2    apples       >apples
             4    peaches           3    peaches
                                    4    ananas       >ananas
                                    5    banana       >banana
             -----------------------------------------------
    

Şimdi yaparsam diff file1 file2:

# diff file1 file2
1,2d0
< apples
< pears
3a2
> apples
4a4,5
> ananas
> banana

Şimdi diffçıktısının ne anlama geldiğini açıklamak kolaydır :

file1Eşit yapmak için file2:

  • 1,2d0: Sil ( d) hatları 1-2gelen file1ve hat değiştirme 0arasında file2buna uygun olarak
  • 3a2: Ekleme ( ahattına) 3arasında file1hat 2arasındafile2
  • 4a4,5: Ekleme satır 4arasında file1hatları 4-5arasındafile2

diffkarşılaştırır file1ile file2geçici belleğinde hattı ve yerleşir farklılıklardan hattı. Yaptıktan sonra file1 eşit file2 bir satırın ilk geçtiği kadar file1, aynı zamanda meydana gelir file2, bir fark söz kadar eşit kadar olan tüm hatlar, genellikle belirtilen ---. Bu durumda, sadece benzer bir satır var oranges. file1Eşit demiştim file2, bunun file1tersi de file2değil , görüldüğü gibi .

Çıktı bu durumda verilen ilk dosya ile ilgilidir file1.


2
İlk açıklamadan hoşlanmıyorum: applesher iki dosyada da olduğu gibi.
VEYA Mapper,

1
@ ORMapper Açıklamayı değiştirdim. Şimdi daha net / daha iyi ses veriyor mu :)?
polim

Tam olarak değil, şimdilik oranges"çok benzer bir satır var" yazdınız . Yanlış: Sadece benzer değil , kesinlikle aynı olan iki çizgi var . Biri okuyor , diğeri okuyor . Ayrıca, açıklamanız (tamamen sırasına dayalı), Stéphane'nin soruya (uzunluğuna dayalı) ilişkin yorumuyla çelişiyor - kim doğru? orangesapples
VEYA Mapper,

@ ORMapper "Bu durumda" ve bundan önceki satırları unuttun. Demek istediğim bu adımda sadece bir tane benzer çizgi var. Daha iyi anlaşılabilmesi için cevabıma bir örnek ekleyeceğim.
polim

1
@ ORMapper Ayrıca uzunluk tabanlı cevabın doğru olduğunu gösteren bir örnek verebilir misiniz?
polim

8

İşte oradalar:

$ diff file1 file2
1d0
< apples
2a2
> apples
$ diff file2 file1
1d0
< oranges
2a2
> oranges

8

Standart (eski) çıktı biçimi, dosyaları farklı alanlarla çevreleyen metni olmayan dosyalar arasındaki farkı görüntüler.

Örneğin: 1d0 <(sil), elmanın 1. satırdan çıkarılması gerektiği file1ve 2a2 >(ekleme), ellerinfile2 2. satırda eklenmesi gerektiği anlamına gelir , böylece her iki dosya da eşleştirilebilir.

Şu anda mevcut olan belgeler info diffdaha fazla açıklıyor:

Bağlam Olmadan Farklılıkları Gösterme

"Normal" diffçıktı formatı, çevreleyen herhangi bir bağlam olmadan her bir farklılık grubunu gösterir. Bazen bu tür çıktılar, yakınlardaki değişmeyen çizgilerin dağınıklığı olmadan çizgilerin nasıl değiştiğini görmenin en net yoludur (içeriğe veya birleştirilen biçimlerle benzer sonuçlar elde etmenize rağmen). Bununla birlikte, bu format artık yama göndermek için yaygın olarak kullanılmamaktadır; Bunun için bağlam formatı ve birleşik format üstündür. Normal biçim, daha eski sürümlerle diffve POSIX standardındaki uyumluluk için varsayılandır . --normalBu çıkış biçimini açıkça seçmek için bu seçeneği kullanın .

Normal Biçimin Detaylı Açıklaması

Normal çıktı formatı bir veya daha fazla farklılık grubundan oluşur; Her bir parça, dosyaların farklı olduğu bir alanı gösterir. Normal formattaki parçalar, şuna benzer:

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

Üç çeşit değişiklik komutu vardır. Her biri birinci dosyadaki satır numarası veya virgülle ayrılmış satır aralığından, yapılacak değişiklik türünü gösteren tek karakterden ve ikinci dosyada satır numarası veya virgülle ayrılmış satır aralığından oluşur. Tüm satır numaraları her dosyadaki orijinal satır numaralarıdır. Değişim komutları türleri:

LaR İlk dosyanın L satırından sonra ikinci dosyanın R aralığında satırları ekleyin. Örneğin, 8a12,15dosya 1'in 8 satırından sonra dosya 2'nin 12-15 satırlarını ekleme anlamına gelir; veya dosya 2'yi dosya 1'e değiştiriyorsanız, dosya 2'nin 12-15 satırlarını silin.

FcT İlk dosyanın F aralığındaki satırları, ikinci dosyanın T aralığındaki satırlarla değiştirin. Bu birleştirilmiş bir ekleme ve silme, ancak daha kompakt gibidir. Örneğin, 5,7c8,10dosya 1'in 5-7 satırlarını, dosya 2'nin 8-10 satırları olarak okumak anlamına gelir; veya eğer dosya 2'yi dosya 1'e değiştiriyorsanız, dosya 1'in 8-7 satırlarını değiştirerek dosya 1'in 5-7 satırlarını okuyun.

RdL R aralığındaki satırları ilk dosyadan silin; L satırı, silinmemiş olsalar ikinci dosyada göründüğü yer. Örneğin, 5,7d3dosya 1'in 5-7 satırlarını silmek anlamına gelir; veya eğer dosya 2'yi dosya 1'e değiştiriyorsanız, dosya 2'nin 3. satırından sonra dosya 1'in 5-7 satırlarını ekleyin.

Ayrıca bakınız:


Bu yüzden portakalları görmek için yan yana ya da birleşik bağlam kullanarak ayırmanız gerekir.

Örnek olarak:

$ diff -y file1 file2
apples                                <
oranges                             oranges
                                  > apples

$ diff -u file1 file2
@@ -1,2 +1,2 @@
-apples
 oranges
+apples
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.