डीआईएफएफ में सिर्फ एक फ़ाइल से लाइनें सूचीबद्ध करना


31

मैं (GNU) DIFF केवल उन पंक्तियों को प्रिंट करना चाहता हूं जो एक फ़ाइल में अलग हैं। तो दिया

    ==> 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 उत्पादन करना

    line2 - in a only

    line4 changed

निम्नलिखित लग रहा है जैसे यह सहायक होना चाहिए, लेकिन यह थोड़ा गूढ़ है:

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

मैन पेज निश्चित रूप से इन झंडों पर एक सा है! अच्छा प्रश्न।
quickshiftin

1
मैं यह बताना चाहता हूं कि 'जानकारी का अंतर' पूर्ण उदाहरण देगा, जानकारी में जानकारी का खजाना है।
Baroudi Safwen

जवाबों:


37

निश्चित नहीं diff अकेले यह कर सकते हैं लेकिन आप हमेशा आपकी मदद करने के लिए अन्य GNU उपयोगिताओं की शक्ति का उपयोग कर सकते हैं।

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

यह अंतर करता है, फिर केवल उन पंक्तियों का चयन करता है जो '-' से शुरू होती हैं - जिन्हें बदला जाता है और diffa.txt फ़ाइल से मान होते हैं, फिर sed बस उन '-' संकेतों को हटा दें।

संपादित करें: कुछ प्रयोगों के बाद diff, नीचे दी गई कमांड की तरह दिखता है कि आप क्या चाहते हैं:

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

एक बंद के लिए पाइप विधि ठीक है। मैं `perl -ne" प्रिंट पसंद करूँगा यदि s / ^ - // " मुझे लगता है कि मैं क्या देखता हूं --changed-group-format='%<' अब मेरे लिए कर रहे हैं ...।
justintime

धन्यवाद। : D मुझे दो कंप्यूटरों के बीच अपने सभी पैकेजों को सूचीबद्ध करने के लिए कुछ इस तरह की आवश्यकता थी और मैंने एसडीएफ का इस्तेमाल किया लेकिन यह थोड़ा बेहतर है।
Rob

10

अधिक सरल विधि का उपयोग करना है comm लिनक्स उपयोगिता (इसे इनपुट के लिए सॉर्ट की गई फ़ाइल चाहिए) यह मानक उत्पादन के लिए लिखता है:

  • लाइनें जो diffa.txt के लिए अद्वितीय हैं

  • लाइनें जो diffb.txt के लिए अद्वितीय हैं

  • लाइनें जो आम हैं

और आप उनमें से प्रत्येक को पैरामीटर 1,2 या 3 के अनुसार दबा सकते हैं। तो youre मामले में यह इस तरह दिखेगा:

comm -23 diffa.txt diffb.txt

यह उन लाइनों को दबाता है जो diffb.txt के लिए अद्वितीय हैं, वे लाइनें जो सामान्य हैं और उन लाइनों को प्रिंट करती हैं जो केवल diffa.txt के लिए अद्वितीय हैं

स्रोत द्वारा: https://www.tutorialspoint.com/unix_commands/comm.htm


मुझे यह बहुत आसान लगा diff जो मैं उम्मीद नहीं कर रहा हूँ। और मेरा मानना ​​है कि यह बीएसडी (यानी मैक ओएस एक्स) और साथ ही उबंटू दोनों पर प्रीइंस्टॉल्ड है ताकि कोई पैकेज मैनेजर बुरे सपने न आए।
Sridhar-Sarnobat

2

मैं उसका उल्लेख करना चाहूंगा comm छँटाई इनपुट फ़ाइलों की अपेक्षा करता है और इस तरह से अलग परिणाम रिपोर्ट करता है diff

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

सार्वभौमिक है। कुडोस से @vava

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.