Liệt kê các dòng từ chỉ một tệp trong DIFF


34

Tôi muốn nhận (GNU) DIFF chỉ in ra các dòng khác nhau trong một tệp. Vì vậy

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

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

tôi muốn diff --someoption diffa.txt diffb.txtsản xuất

    line2 - in a only

    line4 changed

Sau đây có vẻ như nó sẽ hữu ích nhưng nó hơi khó hiểu:

   --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

Trang người đàn ông chắc chắn là một chút ngắn gọn trên những lá cờ! Câu hỏi hay.
quickshiftin

1
Tôi muốn chỉ ra rằng 'thông tin khác biệt' sẽ đưa ra các ví dụ hoàn chỉnh, có rất nhiều thông tin trong thông tin.
Baroudi Safwen

Câu trả lời:


42

Không chắc diff một mình có thể làm điều đó nhưng bạn luôn có thể sử dụng sức mạnh của các tiện ích GNU khác để giúp bạn.

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

Nó thực hiện tìm khác biệt, sau đó chỉ chọn các dòng bắt đầu bằng '-' - những dòng được thay đổi và có giá trị từ tệp diffa.txt, sau đó sedchỉ cần xóa các dấu '-' đó.

Chỉnh sửa: Sau vài thử nghiệm diff, có vẻ như lệnh bên dưới tạo ra những gì bạn muốn:

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

Đối với một trong những phương pháp đường ống là tốt. Tôi thích in `perl -ne" nếu s / ^ - // "` nhưng đó là hương vị. Tôi nghĩ rằng tôi thấy những gì --changed-group-format='%<'đang làm cho tôi bây giờ ....
ngay

Cảm ơn. : DI cần một cái gì đó như thế này để liệt kê tất cả các gói của tôi giữa hai máy tính và tôi đã sử dụng sdiff nhưng điều này có vẻ tốt hơn một chút.
Cướp

12

Phương pháp đơn giản hơn là sử dụng commtiện ích linux (Nó cần tập tin được sắp xếp cho đầu vào). Nó ghi vào đầu ra tiêu chuẩn:

  • các dòng duy nhất cho diffa.txt

  • các dòng duy nhất cho diffb.txt

  • dòng phổ biến

và bạn có thể loại bỏ từng một trong số chúng theo tham số 1,2 hoặc 3 tương ứng. Vì vậy, trong trường hợp của bạn, nó sẽ trông như thế này:

comm -23 diffa.txt diffb.txt

Nó loại bỏ các dòng duy nhất cho diffb.txt, các dòng phổ biến và in ra các dòng duy nhất chỉ dành cho diffa.txt

Nguồn từ: https://www.tutorialspoint.com/unix_commands/comm.htm


Tôi thấy điều này dễ dàng hơn nhiều so với diffviệc không làm những gì tôi mong đợi. Và tôi tin rằng nó đã được cài đặt sẵn cả trên BSD (tức là Mac OS X) cũng như Ubuntu nên không gặp ác mộng với trình quản lý gói.
Sridhar Sarnobat

3

Tôi muốn đề cập rằng commmong đợi các tệp đầu vào được sắp xếp và do đó báo cáo kết quả khác nhau hơn diff.

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

là phổ quát. Thanh danh đến @vava

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.