DIFF içindeki tek bir dosyadan satırları listeleme


34

(GNU) DIFF’i sadece bir dosyadaki farklı satırları yazdırmak istiyorum. Verilen

    ==> diffa.txt <==
    line1
    line2 - in a only
    line3
    line4 changed
    line5

    ==> diffb.txt <==
    line1
    line3
    line4 changed in b
    line5
    line6 in b only

diff --someoption diffa.txt diffb.txtüretmek isterim

    line2 - in a only

    line4 changed

Aşağıdaki, yardımcı olması gerektiği gibi görünüyor, ancak biraz şifreli görünüyor:

   --GTYPE-group-format=GFMT
          Similar, but format GTYPE input groups with GFMT.

   --line-format=LFMT
          Similar, but format all input lines with LFMT.

   --LTYPE-line-format=LFMT
          Similar, but format LTYPE input lines with LFMT.

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

          GFMT may contain:

   %<     lines from FILE1

   %>     lines from FILE2

Bu sayfadaki adam sayfası kesinlikle biraz titiz! İyi soru.
— quickshiftin

1
'Bilgi farkının' tam örnekler vereceğini, bilgide bilgi hazinesi olduğunu belirtmek isterim.
— Baroudi Safwen,

Yanıtlar:


42

Tek diffbaşına yapabileceğinden emin değilsiniz ama her zaman diğer GNU yardımcı programlarının gücünü size yardımcı olmak için kullanabilirsiniz.

diff -u diffa.txt diffb.txt | grep '^-[^-]' | sed 's/^-//'

Farklılığı yapar, daha sonra sedsadece '-' ile başlayan satırları seçer - bunlar değiştirilir ve diffa.txt dosyasındaki değerlere sahiptir, ardından sadece '-' işaretlerini kaldırın.

Düzenleme: Birkaç denemeden sonra diff, aşağıdaki komut ne istediğinizi üretir gibi görünüyor:

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt

Biri için boru yöntemi gayet iyi. S / ^ - // "` ise perl -ne "yazdırmayı tercih ederim ama bu tadı. Sanırım şu an benim için ne --changed-group-format='%<'yaptığını görüyorum ....
— justintime

Teşekkürler. : DI, iki bilgisayar arasındaki bütün paketleri listelemek için böyle bir şeye ihtiyacım vardı ve sdiff kullandım ama bu biraz daha iyi görünüyor.
— Rob

12

Daha basit bir yöntem commlinux yardımcı programını kullanmaktır (Girdi için sıralanmış bir dosyaya ihtiyaç vardır). Standart çıktıya yazar:

  • diffa.txt için benzersiz olan satırlar

  • diffb.txt için benzersiz olan satırlar

  • ortak olan çizgiler

ve bunlardan her birini, uygun şekilde 1,2 veya 3 parametresi ile bastırabilirsiniz. Öyleyse, bunun gibi görünecek:

comm -23 diffa.txt diffb.txt

Diffb.txt için benzersiz olan satırları, yaygın olan satırları ve yalnızca diffa.txt için benzersiz olan satırları yazdırır.

Kaynak: https://www.tutorialspoint.com/unix_commands/comm.htm


Bunu diff, beklediğim şeyi yapmadığından daha kolay buldum . Hem BSD'ye (yani Mac OS X) hem de Ubuntu'ya önceden kurulduğuna inanıyorum, böylece paket yöneticisi kabuslar görmüyor.
— Sridhar Sarnobat

3

commSıralanmış girdi dosyalarını beklediğini ve bu nedenle farklı sonuçlar bildirdiğini belirtmek isterim diff.

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt

evrenseldir. Kavala @vava

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.