सवाल केवल अतिरिक्त और हटाए गए लाइनों को दिखाने के लिए मैं diff कैसे प्राप्त कर सकता हूं? यदि diff यह नहीं कर सकता है, तो कौन सा उपकरण कर सकता है?


केवल अतिरिक्त और हटाए गए लाइनों को दिखाने के लिए मैं diff कैसे प्राप्त कर सकता हूं? यदि diff यह नहीं कर सकता है, तो कौन सा उपकरण कर सकता है?


60
2017-09-25 12:47


मूल


आपको बेहतर और हटाए गए शब्दों का अर्थ परिभाषित करना होगा। विशेष रूप से, एक रेखा बदल सकते हैं? यदि हां, तो आप एक बदली हुई लाइन को कैसे संभालना चाहते हैं? यदि आप सख्ती से लाइन उन्मुख जांच कर रहे हैं, तो एक लाइन बदलती पुरानी रेखा को हटाया जा रहा है और नई लाइन को जोड़ा जा रहा है। उदाहरण के लिए, इसे दो पंक्तियों में विभाजित करने वाली रेखा को कैसे संभालना चाहिए? जैसा कि दो 1 लाइन बदल गई? 2 लाइनें बदल गईं? 1 लाइन हटा दी गई और 2 लाइनें गयीं? जब तक आप गारंटी नहीं दे सकते कि लाइनें कभी नहीं बदलेगी, बस जोड़े और हटाए जाएंगे, मुझे लगता है कि यह बेहतर परिभाषाओं के बिना असफल होने के लिए बर्बाद हो गया है। - Christopher Cashell
मुझे सवाल बहुत अस्पष्ट लगता है। लेकिन कम से कम एक प्रश्न का उत्तर दिया जा सकता है diff A B | grep '^[<>]' - kasperd
आप की तलाश कर रहे हैं comm। - Jenny D
@ क्रिस्टोफर कैशेल, उसका मतलब सॉर्ट ऑर्डर को अनदेखा करना है; एक आम तौर पर आम समस्या है। आमतौर पर यह एक सामान्य diff करने से पहले प्रत्येक तरफ सेगमेंट (लाइनों) को क्रमबद्ध करके किया जाता है। - Pacerier
@Pacerier, क्या आप इसके बारे में निश्चित हैं? या आप अनुमान लगा रहे हैं? सॉर्टिंग या सर्च ऑर्डर के बारे में कुछ भी सवाल में उल्लिखित या संकेत नहीं दिया गया है। जैसा कि यह खड़ा है, सवाल स्पष्ट नहीं है और कई अलग-अलग तरीकों का व्याख्या किया जा सकता है। जानने के बिना पक्का वह क्या पूछ रहा है, हम धारणाएं और समाधान प्रदान कर रहे हैं जो वास्तविक समस्या को हल कर सकते हैं या नहीं। इसके अतिरिक्त, उत्तर में से एक पर मूल पोस्टर की टिप्पणी से पता चलता है कि यह है नहीं सॉर्टिंग से संबंधित है। इसे "जोड़ा और हटाया गया" बनाम "बदले" के अर्थ के साथ करना होगा। - Christopher Cashell


जवाब:


इसे देखने का एक और तरीका:

उन पंक्तियों को दिखाएं जो केवल फ़ाइल में मौजूद हैं: (यानी जो से हटाया गया था)

comm -23 a b

लाइनें दिखाएं जो केवल फाइल बी में मौजूद हैं: (यानी बी में जो जोड़ा गया था)

comm -13 a b

लाइनें दिखाएं जो केवल एक फ़ाइल या दूसरे में मौजूद हैं: (लेकिन दोनों नहीं)

comm -3 a b | sed 's/^\t//'

(चेतावनी: अगर फ़ाइल a लाइनों के साथ शुरू होने वाली रेखाएं हैं, यह (पहला टैब) आउटपुट से हटा दी जाएगी।)

नोट: दोनों फ़ाइलों को ठीक से काम करने के लिए "comm" के लिए सॉर्ट करने की आवश्यकता है। अगर वे पहले से ही क्रमबद्ध नहीं हैं, तो आपको उन्हें सॉर्ट करना चाहिए:

sort <a >a.sorted
sort <b >b.sorted
comm -12 a.sorted b.sorted

अगर फाइलें बहुत लंबी हैं, तो यह काफी बोझ हो सकता है क्योंकि इसे एक अतिरिक्त प्रतिलिपि की आवश्यकता होती है और इसलिए दो गुना अधिक डिस्क स्थान की आवश्यकता होती है।


73
2017-09-25 18:11



सिर्फ यह जोड़ना चाहता था कि सही परिणामों का उत्पादन करने के लिए इस समाधान के लिए दोनों फ़ाइलों को सॉर्ट करने की आवश्यकता है (केस संवेदनशील) - marmor
आधुनिक पर्याप्त गोले पर, आप कुछ के साथ लाइन को सॉर्ट कर सकते हैं comm -12 <(sort a) <(sort b) - Joshua Huber


comm जो भी आप चाहते हैं वह कर सकता है। अपने मैन पेज से:

विवरण

लाइन द्वारा FILE1 और FILE2 लाइन क्रमबद्ध फ़ाइलों की तुलना करें।

बिना विकल्पों के, तीन कॉलम आउटपुट का उत्पादन करें। कॉलम वन   FILE1, कॉलम के लिए अद्वितीय लाइनें हैं   दो में FILE2 के लिए अद्वितीय लाइनें हैं,   और कॉलम तीन में लाइनें आम हैं   दोनों फाइलों के लिए।

ये कॉलम दबाने योग्य हैं -1, -2 तथा -3 क्रमशः।

उदाहरण:

[root@dev ~]# cat a
common
shared
unique

[root@dev ~]# cat b
common
individual
shared

[root@dev ~]# comm -3 a b
    individual
unique

और यदि आप केवल अनन्य रेखाएं चाहते हैं और इस पर ध्यान न दें कि वे किस फ़ाइल में हैं:

[root@dev ~]# comm -3 a b | sed 's/^\t//'
individual
unique

जैसा कि मैन पेज कहता है, फाइलों को पहले से सॉर्ट किया जाना चाहिए।


12
2017-09-25 14:27





संदर्भ के बिना जोड़ों और हटाने को दिखाने के लिए, लाइन नंबर, +, -, <,>! आदि, आप इस तरह diff का उपयोग कर सकते हैं:

diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt 

उदाहरण के लिए, दो फाइलें दी गईं:

a.txt

Common
Common
A-ONLY
Common

b.txt

Common
B-ONLY
Common
Common

निम्न आदेश पंक्तियों को या तो से हटाया जाएगा या बी में जोड़ा जाएगा:

diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt 

उत्पादन:

B-ONLY
A-ONLY

यह थोड़ा अलग कमांड a.txt से हटाई गई रेखाएं दिखाएगा:

diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt 

उत्पादन:

A-ONLY

अंत में, यह आदेश a.txt में जोड़े गए लाइन दिखाएगा

diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt 

उत्पादन

B-ONLY

8
2018-01-05 06:41





डिफॉल्ट रूप से diff क्या करता है ... शायद आपको व्हाइटस्पेस को अनदेखा करने के लिए कुछ झंडे जोड़ने की ज़रूरत है?

diff -b -B

रिक्त रेखाओं और रिक्त स्थान की विभिन्न संख्याओं को अनदेखा करना चाहिए।


2
2017-09-25 13:26



नहीं, यह चेंज लाइनों को भी दिखाता है (रेखाएं जिनमें एक चरित्र या चार अलग-अलग होते हैं)। मुझे लाइनें चाहिए जो केवल बाएं या दाएं में मौजूद हों। - C. Ross
आप तर्क दे सकते हैं कि एक चेंज फ़ाइल के अलग-अलग संस्करण प्रत्येक बाएं या दाएं में मौजूद हैं। - markdrayton
भिन्नता (या किसी अन्य उपकरण) के लिए कोई रास्ता नहीं है कि भरोसेमंद रूप से बताएं कि क्या परिवर्तन है, और एक हटाई गई रेखा को एक नई लाइन द्वारा प्रतिस्थापित किया जा रहा है। - Cian
तकनीकी रूप से, diff एक "बदली" रेखा का व्यवहार करता है जैसे कि मूल रेखा हटा दी गई थी और एक नई लाइन जोड़ा गया था ... इसलिए तकनीकी रूप से यह आपको केवल जोड़ और हटाई गई लाइन दिखा रहा है। - KFro


नहीं, diff वास्तव में किसी भी तरह से सोचने के तरीके में दो फाइलों के बीच मतभेद नहीं दिखाता है। यह एक उपकरण के लिए संपादन आदेशों का एक अनुक्रम पैदा करता है patch एक फ़ाइल को दूसरे में बदलने के लिए उपयोग करें।

जो भी आप खोज रहे हैं, उसे करने के किसी भी प्रयास के लिए कठिनाई यह है कि परिभाषित करने के लिए कि एक पंक्ति का गठन किस प्रकार किया गया है, जिसे एक हटाए गए एक के बाद बदल दिया गया है। लाइनों को जोड़े जाने पर, हटाए जाने और एक-दूसरे के समीप बदलकर क्या करना है।


2
2017-09-25 15:59



मेरे विचार से भी। मूल के संशोधन के बजाय इसे एक नया मानने के लिए लाइन में वर्णों का कितना प्रतिशत बदलना है? तकनीकी रूप से यदि आपके पास एक चरित्र सामान्य है, तो आप इसे हटाने और सम्मिलन के बजाय "परिवर्तन" पर विचार कर सकते हैं। - Kamil Kisiel
यह एक लंबा समय रहा है क्योंकि मैंने देखा है diff सूत्रों, लेकिन मुझे लगता है कि दो फाइलें सिंक में रहने के लिए कहां मिलती हैं और मुझे लगता है कि रेखाएं कितनी दूर हैं, इस पर आधारित है कि मुझे छोड़ने के लिए एक सीमा है। लेकिन मुझे किसी भी इंट्रा-लाइन मिलान को याद नहीं है (वैकल्पिक रूप से) सफेद जगह को ध्वस्त या केस को अनदेखा कर रहा है। या (शायद) उस पर प्रभाव को प्रभावित करते हैं। किसी भी मामले में, यह सब कुछ है patch और "vgrep" बस सवारी के लिए आता है। शायद। मंगलवार को। - Dennis Williamson


विजुअल तुलना टूल एक साथ दो फाइलों को फिट करते हैं ताकि लाइनों की एक ही संख्या के साथ एक सेगमेंट लेकिन अलग सामग्री को एक परिवर्तित सेगमेंट माना जाएगा। मिलान खंडों के बीच पूरी तरह से नई लाइनों को जोड़ा खंड माना जाता है।

यह भी कैसे है sdiff कमांड लाइन उपकरण काम करता है, जो एक टर्मिनल में दो फाइलों की साइड-बाय-साइड तुलना दिखाता है। बदली गई लाइनें अलग-अलग हैं चरित्र। यदि कोई पंक्ति केवल फ़ाइल ए में मौजूद है, <को विभाजक चरित्र के रूप में उपयोग किया जाता है। यदि एक पंक्ति केवल फाइल बी में मौजूद है,> विभाजक के रूप में प्रयोग किया जाता है। यदि आपके पास फ़ाइलों में <और> वर्ण नहीं हैं, तो आप इसका उपयोग केवल अतिरिक्त पंक्तियों को दिखाने के लिए कर सकते हैं:

sdiff A B | grep '[<>]'

2
2017-10-17 14:34





धन्यवाद सेनेरवी, आपका समाधान (इसके लिए वोट नहीं दिया गया) वास्तव में मुझे वास्तव में मुझे एक पृष्ठ पर उम्र की तलाश करने के बाद जो चाहिए था उसे दिया।

अपने उत्तर का उपयोग करके, मैं चीजों की सूची बदलने / जोड़ा / हटाए जाने के लिए यहां आया हूं। उदाहरण / etc / passwd फ़ाइल के 2 संस्करणों का उपयोग करता है और प्रासंगिक रिकॉर्ड के लिए उपयोगकर्ता नाम प्रिंट करता है।

#!/bin/bash
sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}'
sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}'
sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'

2
2017-11-18 12:05



ध्यान दें कि "एक रेखा को संशोधित किया गया है" और "एक रेखा को हटा दिया गया है और" के बीच का अंतर हटा दिया गया है एक और रेखा को नीचे या उससे ऊपर जोड़ा गया है "अर्थपूर्ण है। एक सामान्य पाठ आधारित diff उपकरण उन मामलों को अलग नहीं कर सकता है। नतीजतन, आपका एसडीएफ आधारित उत्तर सभी मामलों के लिए विश्वसनीय रूप से काम नहीं कर सकता है। - Mikko Rantalainen


file1:

text670_1
text067_1
text067_2

करें 2:

text04_1
text04_2
text05_1
text05_2
text067_1
text067_2
text1000_1

उपयोग:

diff -y file1 file2

यह संदर्भ फ़ाइलों के लिए दो कॉलम दिखाता है।

आउटपुट:

text670_1                           
                                  > text04_1
                                  > text04_2
                                  > text05_1
                                  > text05_2
text067_1                           text67_1
text067_2                           text67_2
                                  > text1000_1

-1
2017-10-17 18:42