दो पाठ फ़ाइलों (अंतर के विपरीत) की सामान्य रेखाओं (समानताएं) को आउटपुट करें?


21

दो फाइलों के बीच परिवर्तन प्रदर्शित करने के लिए डिफ एक शानदार उपकरण है। लेकिन दो पाठ फ़ाइलों (अंतरों की अनदेखी करते हुए) की समानताएं कैसे प्रदर्शित करें?

यानी नमूना इनपुट:

a:
Foo Bar
X
Hello
World
42

b:
Foo Baz
Hello
World
23

छद्म उत्पादन (कुछ इस तरह):

@@ 2,3
=Hello World

बस दोनों फ़ाइलों को सॉर्ट करना और कॉम का उपयोग करना पर्याप्त नहीं है, क्योंकि उस स्थिति में लाइन की जानकारी खो जाती है।

जवाबों:


24

कैसे आप एक अंतर नहीं चाहते हैं, भले ही अंतर का उपयोग करने के बारे में? इसे इस्तेमाल करे:

diff --unchanged-group-format='@@ %dn,%df 
  %<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt

यहाँ आपके नमूना डेटा के साथ मुझे क्या मिलेगा:

$ cat a.txt 
Foo Bar
X
Hello
World
42
$ cat b.txt 
Foo Baz
Hello
World
23
$ diff --unchanged-group-format='@@ %dn,%df
%<' --old-group-format='' --new-group-format='' \
  --changed-group-format='' a.txt b.txt
@@ 2,3
Hello
World

2
आप इस तरह एक शाब्दिक नई पंक्ति को एम्बेड करने से बच सकते हैं:...%df'$'\n''%<'...
अगली सूचना तक

1
आप इसे इस तरह भी कर सकते हैं: ... --unchanged-group-format="@@ %dn,%df%c'\012'%<" ...(दोहरे उद्धरण चिह्नों पर ध्यान दें)
अगली सूचना तक रोका गया।

उत्तम सामग्री! मैं इन विकल्पों को नहीं जानता था, क्योंकि मैंने सिर्फ मैन पेज को देखा था ...
maxschlepzig

मैं diff --version diff (GNU diffutils) 2.8.1 का उपयोग कर रहा हूं और मुझे निम्न त्रुटि मिलती है: अंतर: परस्पर विरोधी आउटपुट शैली विकल्प भिन्न होते हैं: अधिक जानकारी के लिए `diff-help 'आज़माएं।
सुजय

मुझे "त्रुटि: भिन्न: परस्पर विरोधी आउटपुट शैली विकल्प भिन्न हो रहे थे" क्योंकि मुझे एक अलग उपनाम परिभाषित किया गया था। which diffयह देखने के लिए उपयोग करें कि क्या यह आपकी समस्या है।
justinjhendrick

14
grep -Fxf file1 file2

-Fइसका मतलब है कि सादे तार (रेगेक्स नहीं), -xकेवल पूरे-लाइन मिलान का -fमतलब है , इसका मतलब है कि 'पैटर्न' (यानी लाइनें) को उसके तर्क नाम की फ़ाइल से लें


3
-fऔर -Fविमर्श नहीं कर रहे हैं ?. कम से कम मेरे grepसंस्करण में तो ऐसा ही है। मुझे तर्क देने, पसंद करने और फिर काम करने के लिए file2इनपुट प्रदान करने की आवश्यकता है । -fcat file1 | grep -Fxf file2
बिरई १५'१२

यह मेरे लिए काम नहीं है।
चामिंडा बांद्रा

7

commइस्तेमाल किया जा सकता है। man commसभी विकल्पों के लिए, लेकिन आप comm -12 ...केवल उन इनपुटों को दिखाने के लिए उपयोग करना चाहेंगे जो दोनों इनपुट में मौजूद हैं।

जैसा कि लोगों ने बताया है, आपको अपना इनपुट पास करना होगा sort पहले ।


1
एचएम, वह केवल सामान्य लाइनों के लिए काम करता है जो दोनों फाइलों में एक ही लाइन नंबर पर हैं।
15

2
कॉम केवल छांटने वाली फ़ाइलों के लिए लगता है और ओपी के usecase के लिए उस उपयोगी आउटपुट को देने के लिए नहीं। उसका उदाहरण: $ comm -12 ab हैलो वर्ल्ड कॉम: फ़ाइल 1 क्रमबद्ध क्रम में नहीं है: फ़ाइल 2 क्रमबद्ध क्रम में नहीं है
Marcel Stimberg

@maxschlepzig: आपको अपनी फ़ाइलों को उन्हें पास करने से पहले क्रमबद्ध करना चाहिए।
हेमंत

2
सॉर्ट करने से आपको सामान्य रेखाओं की स्थिति की सभी जानकारियों से छुटकारा मिल जाता है, हालाँकि। आप इनकी तुलना करने से पहले फाइलों को अलग-अलग नहीं करेंगे।
बजे मार्सेल स्टिमबर्ग

7

मुझे नहीं लगता कि एक भी ऐसा आदेश है जो वह करता है जो आप करना चाहते हैं। आप के उत्पादन के diffसाथ गठबंधन करने की कोशिश कर सकते हैं grep, यद्यपि। यदि आपकी पाठ फ़ाइलों में कोई भी वर्ण नहीं है |, <तो >, निम्नलिखित आपको कुछ उपयोगी आउटपुट देता है:

$ diff --side-by-side a b | grep -n -v "[|<>]"
3:Hello                             Hello
4:World                             World

इसे आजमाएँ:diff --width=155 --left-column --side-by-side a b | grep -n -v '|' | sed 's/ *($//'
अगली सूचना तक रुकें।

यह बेहतर लग रहा है - लेकिन आपको या तो फ़ाइल में अतिरिक्त लाइनों से छुटकारा पाने के लिए grep में <और> को शामिल करना होगा।
मार्सेल स्टिमबर्ग

2

डिक ग्रुन ने इस तरह की चीज़ों के लिए उपकरणों का एक परिवार लिखा:

http://dickgrune.com/Programs/similarity_tester/

ऐसे संस्करण हैं जो विभिन्न भाषाओं के वाक्य विन्यास को पार्स करते हैं, ताकि नामांकित चर जैसी चीजों को अपरिवर्तित रूप में देखा जा सके।

इसे similarity-testerडेबियन और उबंटू में पैक किया गया है।

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