2010-11-02 14 views
55

एक आइटम के साथ दो पाठ फ़ाइलों के बीच अंतर पाते हैं मैं दो फ़ाइलें:प्रति पंक्ति

फ़ाइल 1

dsf 
sdfsd 
dsfsdf 

फ़ाइल 2

ljljlj 
lkklk 
dsf 
sdfsd 
dsfsdf 

मैं प्रदर्शित करने के लिए क्या फ़ाइल 2 में चाहते हैं लेकिन फ़ाइल 1 में नहीं, इसलिए फ़ाइल 3

ljljlj 
lkklk 

उत्तर

33
जैसा दिखना चाहिए

आप

grep -f file1 file2 

या

grep -v -F -x -f file1 file2 
+4

यह काम नहीं करेगा। फ़ाइल 2 में 'dsfblah' जोड़ने का प्रयास करें। – dogbane

+5

आप इसे 'grep -F -x' – tripleee

+2

' के साथ ठीक कर सकते हैं, मुझे लगता है कि आपका सुझाव उत्तर @tripleee – jopasserat

7

अगर आप उन्हें एक निश्चित क्रम में उम्मीद कर रहे हैं, तो आप सिर्फ उपयोग कर सकते हैं की कोशिश कर सकते diff

diff file1 file2 | grep ">"

112
grep -Fxvf file1 file2 

झंडे क्या मतलब :

(Diff और सीएमपी और अधिक कुशल हैं:
-F, --fixed-strings 
       Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.  
-x, --line-regexp 
       Select only those matches that exactly match the whole line. 
-v, --invert-match 
       Invert the sense of matching, to select non-matching lines. 
-f FILE, --file=FILE 
       Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. 
+2

विकल्प '-n' को अलग-अलग पंक्तियों में जोड़ा जा सकता है – boczniak767

+0

प्रत्येक पंक्ति के गैर-मिलान भाग को हाइलाइट करने का कोई तरीका? – PeterVermont

+0

इसके साथ आप केवल पहला अंतर पा सकते हैं और इसकी लाइन संख्या भी प्रिंट कर सकते हैं: 'grep-m 1 -Fnxvf file1 file2' –

31

आप दो क्रमबद्ध फ़ाइलों

comm -13 <(sort file1) <(sort file2) 
+2

एफवाईआई, यह वास्तव में 'कम -1 -3 फ़ाइल 1 फ़ाइल 2' है। दो झंडे '1' और' 3' एक में विलय कर रहे हैं। – cevaris

+0

comm -23 <(sort file1) <(sort file2) केवल फाइल 1 में आउटपुट करेगा और फ़ाइल 2 में नहीं होगा - इसका सबसे अच्छा हिस्सा फ़ाइल 2 कार्यों में कोई व्यवस्था है जहां diff विफल हो जाएगा; फ़ाइल 1 में 1,2,3,4,5 है और फ़ाइल 2 में 1,2,4,5 है जो आपको 3 diff मिल जाएगा यह गलत हो जाएगा – user1213320

6
join -v 2 <(sort file1) <(sort file2) 
1

आप छोरों उपयोग करने के लिए आप इस तरह की कोशिश कर सकते हैं की तुलना करने के comm आदेश का उपयोग कर सकते हैं।)

while read line 
do 
    flag = 0 
    while read line2 
    do 
     if ("$line" = "$line2") 
     then 
      flag = 1 
     fi 
    done < file1 
    if (flag -eq 0) 
    then 
     echo $line > file3 
    fi 
done < file2 

नोट: कार्यक्रम केवल क्या किया जा सकता है अगर यू न प्रणाली का उपयोग करना चाहते में एक बुनियादी अंतर्दृष्टि प्रदान करना है .. इस तरह के अंतर n कॉम के रूप में कॉल

1

एक awk जवाब:

awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2

11

मैं सफलतापूर्वक

diff "${file1}" "${file2}" | grep "<" | sed 's/^<//g' > "${diff_file}" 

इस्तेमाल किया Outputting एक फ़ाइल में अंतर।

+0

एक diff टूल हाहा का उपयोग करने से भिन्न अंतर खोजने का बेहतर तरीका क्या है। क्या इस बनाम grep का उपयोग करने के साथ उच्च ऊपरी है? – Sirens

2
 
file1 
m1 
m2 
m3 

file2 
m2 
m4 
m5 

>awk 'NR == FNR {file1[$0]++; next} !($0 in file1)' file1 file2 
m4 
m5 

>awk 'NR == FNR {file1[$0]++; next} ($0 in file1)' file1 file2 
m2 

> What's awk command to get 'm1 and m3' ?? as in file1 and not in file2? 
m1 
m3 
3

एक Luca के जवाब पर एक मामूली बदलाव करने की कोशिश की और यह मेरे लिए काम किया।

diff file1 file2 | grep ">" | sed 's/^> //g' > diff_file 

ध्यान दें कि sed में खोजा गया पैटर्न एक > फिर एक रिक्ति है।

0

जीएनयू sed के साथ:

sed 's#[^^]#[&]#g;s#\^#\\^#g;s#^#/^#;s#$#$/d#' file1 | sed -f- file2 

कैसे काम करता है:

/^[d][s][f]$/d 
/^[s][d][f][s][d]$/d 
/^[d][s][f][s][d][f]$/d 

तो यह द्वारा एक sed स्क्रिप्ट के रूप में प्रयोग किया जाता है:

पहले sed इस तरह एक निर्गम का उत्पादन दूसरा sed

संबंधित मुद्दे