स्विच की गई लाइनों के साथ अंतर दो फ़ाइलों का परिणाम एक ही पंक्ति को दो बार याद करना कहता है


28

मैं समझने की कोशिश कर रहा हूँ कि linux दो फाइलों पर अलग-अलग कमांड है, जिनकी पंक्तियाँ एक-दूसरे का सिर्फ क्रमचय हैं, लेकिन जो आउटपुट उत्पन्न करता है, उसे टटोलने में सक्षम नहीं है। नीचे दिए गए तीन आदेशों पर विचार करें:

[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2 
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples

क्या कोई अंतर से ऊपर के क्रिप्टो आउटपुट को समझा सकता है।

  1. आउटपुट में "संतरे" का कोई उल्लेख क्यों नहीं है?
  2. क्या करता है 1d0और क्या 2a2मतलब है?

मैं इस जवाब से समझता हूं कि:

"<" का अर्थ है लाइन फ़ाइल 2 में अनुपलब्ध है और ">" का अर्थ है लाइन फ़ाइल 1 में अनुपलब्ध है

लेकिन यह नहीं समझाता कि संतरे आउटपुट में क्यों गायब है।


12
क्योंकि orangesदो फ़ाइलों के बीच सबसे बड़ा सामान्य हिस्सा है, इसलिए आपको जो प्राप्त होता है, वह दोनों के बीच अंतर को व्यक्त करने का सबसे छोटा तरीका है।
स्टीफन चेजलस

10
और यदि आप अधिक पठनीय आउटपुट चाहते हैं, तो diff -u file1 file2इसके बजाय उपयोग करें । इसे "एकीकृत अंतर" प्रारूप कहा जाता है। मूल अंतर प्रारूप बहुत कॉम्पैक्ट होना चाहिए था, लेकिन एकीकृत अंतर बहुत अधिक पठनीय होना चाहिए।
गॉडलीजेक

4
@godlygeek याdiff -y file1 file2
user80551

जवाबों:


27

रिपोर्ट को समझने के लिए, यह याद रखें कि diffयह पूर्व निर्धारित है, यह वर्णन करते हुए कि पहली फ़ाइल ( file1) को दूसरी फ़ाइल के समान बनाने के लिए क्या परिवर्तन करने की आवश्यकता है file2

विशेष रूप से, dमें 1d0साधन को नष्ट और aमें 2a2साधन जोड़ने

इस प्रकार:

  • 1d0इसका मतलब है कि पंक्ति 1 को file1( apples) में हटाया जाना चाहिए । 0में 1d0साधन लाइन 0 जहां वे दूसरी फ़ाइल (में दिखाई दिया है | है file2) वे नहीं हटा दिया गया था। इसका मतलब है कि जब (पीछे की ओर) file2को बदलने के लिए file1लाइन 1 की file1लाइन 0 के बाद file2
  • 2a2का अर्थ है दूसरी पंक्ति ( oranges) file2को अब दूसरी पंक्ति से जोड़ना ( file1पहली पंक्ति को हटाने के बाद file1, orangesपंक्ति 1 पर स्विच किया गया)

क्या है 0में 1d0?
गीक

@Geek मेरे संपादन देख
अराजकता

1
@ गीक लेकिन सावधान रहो, कि मस्तिष्क में गांठ बना सकते हैं =)
अराजकता

कि वास्तव में, समुद्री मील बनाने शुरू कर दिया है :-)
Geek

13

इन फाइलों पर विचार करें:

file1:

# cat file1
apples
pears
oranges
peaches

file2:

# cat file2
oranges
apples
peaches
ananas
banana

यह कैसे diffकाम करता है, यह आदेश-आधारित है:

  1. diffकी लाइनों के पहले खंड पढ़ता है file1और file2बराबर लाइनों को खोजने के लिए, और कोशिश करता:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      -------------------------------
    ->oranges    ->oranges
      peaches      apples
                   peaches
                   ananas
                   banana
    
  2. अब यह उन सभी लाइनों को छोड़ देगा जो दोनों फाइलों में समान हैं, जो orangesइस स्थिति में है:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
      -------------------------------
    ->peaches    ->apples
                   peaches
                   ananas
                   banana
    
  3. अब समान रेखाओं का एक और सेट खोजें और अंतर का प्रिंट आउट लें:

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      -------------------------------
    ->peaches    ->peaches
                   ananas
                   banana
    
  4. समान पंक्तियों को छोड़ें

      file1        file2        differences on left (<) or right side (>)
      apples                   <apples
      pears                    <pears 
      oranges      oranges
                   apples      >apples
      peaches      peaches
      -------------------------------
    ->           ->ananas
                   banana
    
  5. यदि संभव हो तो समान रेखाएँ खोजें, और अंतर प्रिंट करें:

    line_file1    file1    line_file2    file2        differences on left (<) or right side (>)
             1    apples                              <apples 
             2    pears                               <pears 
             3    oranges           1    oranges
                                    2    apples       >apples
             4    peaches           3    peaches
                                    4    ananas       >ananas
                                    5    banana       >banana
             -----------------------------------------------
    

अब अगर मैं diff file1 file2:

# diff file1 file2
1,2d0
< apples
< pears
3a2
> apples
4a4,5
> ananas
> banana

अब यह स्पष्ट करना आसान है कि diffउत्पादन का क्या मतलब है:

बनाने के लिए file1करने के लिए बराबर file2:

  • 1,2d0: हटाएँ ( d) लाइनों 1-2से file1और लाइन को संशोधित 0की file2तदनुसार
  • 3a2: परिशिष्ट ( a) 3की file1पंक्ति 2के लिएfile2
  • 4a4,5: की लाइनों के लिए आवेदन करें4file14-5file2

diffलाइन से लाइन के file1साथ तुलना file2और अस्थायी मेमोरी में अंतर को सुलझाता है। जब तक कि किसी रेखा के पहली घटना के file1 बराबर होने के बाद , जो तब भी होती है , तब तक सभी रेखाएँ जो तब तक बराबर होती हैं जब तक कि अंतर का उल्लेख नहीं किया जाता है, अक्सर संकेत के रूप में । इस मामले में केवल एक समान रेखा है, जो है । ध्यान दें कि मैंने कहा के बराबर है , इसलिए दूसरे के आसपास देखा जाता है और नहीं।file2file1file2---orangesfile1file2file1file2

आउटपुट इस मामले में दी गई पहली फ़ाइल के संबंध में है file1


2
मुझे प्रारंभिक स्पष्टीकरण पसंद नहीं है: applesदोनों फाइलों में भी होता है।
या मैपर

1
@ORMapper मैंने स्पष्टीकरण बदल दिया। क्या यह अब अधिक स्पष्ट / बेहतर लगता है :)?
पॉलीम

बिलकुल नहीं, अभी के लिए आपने लिखा "केवल एक ही रेखा है, जो है oranges"। गलत: वास्तव में दो लाइनें हैं, जो न केवल समान हैं , बल्कि बिल्कुल समान हैं । उनमें से एक पढ़ता है oranges, दूसरा पढ़ता है apples। इसके अलावा, आपकी व्याख्या (विशुद्ध रूप से आदेश-आधारित) स्टैफेन की टिप्पणी पर विरोधाभास है (लंबाई-आधारित) - कौन सही है?
या मैपर

@ORMapper आप "इस मामले में" और उससे पहले की लाइनें भूल गए। मेरा मतलब था कि इस कदम में केवल एक समान रेखा है। मैं सिर्फ अपने उत्तर के लिए एक उदाहरण जोड़ूंगा ताकि इसे बेहतर तरीके से समझा जा सके।
पॉलीम

1
@ORMapper क्या आप मुझे एक उदाहरण दे सकते हैं जिससे पता चलता है कि लंबाई-आधारित उत्तर सही है?
पॉलीम

8

लो वो आ गए:

$ diff file1 file2
1d0
< apples
2a2
> apples
$ diff file2 file1
1d0
< oranges
2a2
> oranges

8

मानक (पुराना) आउटपुट स्वरूप उन फ़ाइलों के बीच अंतर को प्रदर्शित करेगा जो बिना पाठ के उन क्षेत्रों के साथ होती हैं जहाँ फाइलें भिन्न होती हैं।

उदाहरण के लिए: 1d0 <(डिलीट) का अर्थ है कि सेब को 1 लाइन से हटाया जाना चाहिए file1, और 2a2 >(एपेंड) का मतलब है कि सेबfile2 को 2 लाइन पर जोड़ने की जरूरत है , इसलिए दोनों फाइलों का मिलान किया जा सकता है।

इस पर उपलब्ध प्रलेखन info diffइसे और अधिक समझाता है:

प्रसंग के बिना अंतर दिखाना

"सामान्य" diffआउटपुट स्वरूप किसी भी आसपास के संदर्भ के बिना मतभेदों के प्रत्येक हंक को दर्शाता है। कभी-कभी इस तरह का आउटपुट यह देखने का सबसे स्पष्ट तरीका है कि आस-पास अपरिवर्तित लाइनों के अव्यवस्था के बिना, लाइनों को कैसे बदल दिया गया है (हालांकि आप संदर्भ के साथ समान परिणाम प्राप्त कर सकते हैं या संदर्भ के 0 लाइनों का उपयोग करके एकीकृत प्रारूप)। हालाँकि, इस प्रारूप का उपयोग व्यापक रूप से पैच भेजने के लिए नहीं किया जाता है; उस उद्देश्य के लिए, संदर्भ प्रारूप और एकीकृत प्रारूप बेहतर हैं। सामान्य स्वरूप पुराने संस्करणों diffऔर POSIX मानक के साथ संगतता के लिए डिफ़ॉल्ट है । --normalइस आउटपुट प्रारूप को स्पष्ट रूप से चुनने के लिए विकल्प का उपयोग करें ।

सामान्य प्रारूप का विस्तृत विवरण

सामान्य आउटपुट प्रारूप में एक या अधिक भिन्नताएँ होती हैं; प्रत्येक हंक एक क्षेत्र दिखाता है जहाँ फाइलें भिन्न होती हैं। सामान्य प्रारूप हॉक इस तरह दिखते हैं:

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

तीन प्रकार के परिवर्तन आदेश हैं। प्रत्येक में पहली फ़ाइल में लाइन नंबर या अल्पविराम से अलग की गई रेखाएँ होती हैं, एक एकल वर्ण जो बनाने के लिए परिवर्तन का संकेत देता है, और दूसरी फ़ाइल में एक पंक्ति संख्या या अल्पविराम से अलग की गई रेखा होती है। सभी लाइन नंबर प्रत्येक फ़ाइल में मूल लाइन नंबर हैं। परिवर्तन आदेशों के प्रकार हैं:

LaR पहली फ़ाइल के लाइन L के बाद दूसरी फ़ाइल के रेंज R में लाइनें जोड़ें। उदाहरण के लिए, 8a12,15फ़ाइल 1 की लाइन 8 के बाद फ़ाइल 2 के 12-15 लाइनों को जोड़ने का मतलब है; या, यदि फ़ाइल 2 को फ़ाइल 1 में बदलते हैं, तो फ़ाइल 2 की 12-15 पंक्तियों को हटा दें।

FcT पहली फ़ाइल के रेंज एफ में लाइनों को दूसरी फाइल की रेंज टी में लाइनों के साथ बदलें। यह एक संयुक्त ऐड और डिलीट की तरह है, लेकिन अधिक कॉम्पैक्ट है। उदाहरण के लिए, 5,7c8,10फ़ाइल 2 के 8-10 की लाइनों के रूप में पढ़ने के लिए फ़ाइल 1 की लाइनों 5-7 को बदलने का मतलब है; या, यदि फ़ाइल 2 को फ़ाइल 1 में बदल रही है, तो फ़ाइल 1 की लाइनों 5-7 के रूप में पढ़ने के लिए फ़ाइल 2 की 8-10 पंक्तियों को बदलें।

RdL पहली फ़ाइल से रेंज आर में लाइनें हटाएं; लाइन एल वह जगह है जहां वे दूसरी फाइल में दिखाई देते थे, उन्हें डिलीट नहीं किया गया था। उदाहरण के लिए, 5,7d3फ़ाइल 1 की 5-7 लाइनें हटाएं; या, यदि फ़ाइल 2 को फ़ाइल 1 में बदलते हैं, तो फ़ाइल 2 की पंक्ति 3 के बाद फ़ाइल 1 की 5-7 रेखाएँ जोड़ें।

यह भी देखें:


तो संतरे को देखने के लिए, आपको इसे एक तरफ से या एकीकृत संदर्भ का उपयोग करके अलग करना होगा।

उदाहरण में:

$ diff -y file1 file2
apples                                <
oranges                             oranges
                                  > apples

$ diff -u file1 file2
@@ -1,2 +1,2 @@
-apples
 oranges
+apples
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.