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.