Cantumkan baris dari hanya satu file di DIFF

34

Saya ingin mendapatkan (GNU) DIFF untuk mencetak hanya garis yang berbeda dalam satu file. Jadi diberikan

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

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

saya ingin diff --someoption diffa.txt diffb.txtmenghasilkan

    line2 - in a only

    line4 changed

Berikut ini tampak seolah-olah itu harus membantu tetapi agak samar:

   --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
tepat waktu
sumber
Halaman manual pasti sedikit tersingkat pada bendera-bendera ini! Pertanyaan bagus.
quickshiftin
1
Saya ingin menunjukkan bahwa 'info diff' akan memberikan contoh lengkap, ada banyak informasi dalam info.
Baroudi Safwen

Jawaban:

42

Tidak yakin diffsendiri bisa melakukannya tetapi Anda selalu dapat menggunakan kekuatan utilitas GNU lain untuk membantu Anda.

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

Itu melakukan diff, kemudian memilih hanya baris yang dimulai dengan '-' - yang diubah dan memiliki nilai dari file diffa.txt, kemudian sedhapus saja tanda-tanda '-' itu.

Sunting: Setelah beberapa percobaan dengan diff, sepertinya perintah di bawah ini menghasilkan apa yang Anda inginkan:

diff --changed-group-format='%<' --unchanged-group-format='' diffa.txt diffb.txt
vava
sumber
Untuk satu dari metode pipa baik-baik saja. Saya lebih suka `perl -ne" print if s / ^ - // "` tapi itu rasanya. Saya rasa saya mengerti apa --changed-group-format='%<'yang saya lakukan sekarang ....
justintime
Terima kasih. : DI memerlukan sesuatu seperti ini untuk mendaftar semua paket saya antara dua komputer dan saya menggunakan sdiff tetapi ini terlihat sedikit lebih baik.
Rob
12

Metode yang lebih sederhana adalah dengan menggunakan commutilitas linux (Perlu file yang diurutkan untuk input). Itu menulis ke output standar:

  • baris yang unik untuk diffa.txt

  • baris yang unik untuk diffb.txt

  • garis yang umum

dan Anda dapat menekan masing-masing dengan parameter 1,2 atau 3 sesuai. Jadi dalam kasus Anda akan terlihat seperti ini:

comm -23 diffa.txt diffb.txt

Ini menekan garis yang unik untuk diffb.txt, garis yang umum dan mencetak garis yang unik hanya untuk diffa.txt

Sumber dari: https://www.tutorialspoint.com/unix_commands/comm.htm

hukko
sumber
Saya menemukan ini jauh lebih mudah daripada diffyang tidak melakukan apa yang saya harapkan. Dan saya percaya itu sudah terinstal baik pada BSD (yaitu Mac OS X) maupun Ubuntu sehingga tidak ada mimpi buruk manajer paket.
Sridhar Sarnobat
3

Saya ingin menyebutkan bahwa commmengharapkan file input yang diurutkan dan dengan demikian melaporkan hasil yang berbeda dari diff.

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

bersifat universal. Kudos to @vava

PSchwede
sumber