टेक्स्ट फ़ाइलों को घटाने के लिए यूनिक्स में टूल?


16

मेरे पास एक बड़ी फ़ाइल है जो एक बड़ी तालिका के रूप में अर्धविराम द्वारा अलग किए गए पाठ फ़ील्ड से बना है। इसकी छंटनी की गई है। मेरे पास एक ही पाठ फ़ील्ड से बना एक छोटा फ़ाइल है। कुछ बिंदु पर, किसी ने इस फ़ाइल को दूसरों के साथ मिलाया और फिर ऊपर वर्णित बड़ी फ़ाइल बनाने के लिए एक प्रकार किया। मैं बड़ी फ़ाइल से छोटी फ़ाइल की पंक्तियों को घटाना चाहता हूं (यानी छोटी फ़ाइल में प्रत्येक पंक्ति के लिए, यदि बड़ी फ़ाइल में मिलान स्ट्रिंग मौजूद है, तो उस फ़ाइल को बड़ी फ़ाइल में हटा दें)।

फ़ाइल लगभग इसी तरह दिखती है

GenericClass1; 1; 2; NA; 3; 4;
GenericClass1; 5; 6; NA; 7; 8;
GenericClass2; 1; 5; NA; 3; 8;
GenericClass2; 2; 6; NA; 4; 1;

आदि

क्या ऐसा करने के लिए एक त्वरित उत्तम दर्जे का तरीका है या मुझे awk का उपयोग करना है?

जवाबों:


28

आप उपयोग कर सकते हैं grep। इसे इनपुट के रूप में छोटी फ़ाइल दें और इसे गैर-मिलान लाइनों को खोजने के लिए कहें:

grep -vxFf file.txt bigfile.txt > newbigfile.txt

उपयोग किए गए विकल्प हैं:

   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched.  (-F is specified by
          POSIX.)
   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)

   -v, --invert-match
          Invert the sense of matching, to select non-matching lines.  (-v
          is specified by POSIX.)
   -x, --line-regexp
          Select only those matches that exactly match the whole line.  
          (-x is specified by POSIX.)

अच्छा लगा, पूरी तरह से काम किया। बहुत बहुत धन्यवाद।
Escher

1
यह अच्छा है कि यह काम किया है, लेकिन यह मुझे लगता है कि यह -xविकल्प के साथ भी बेहतर होता , अगर छोटी फाइल में एक लाइन मेरे लिए मुख्य फाइल में एक और लाइन के विकल्प के रूप में होती। इसके अलावा, यह काफी संभव है कि @ UlrichSchwarz का उत्तर तेज हो।
रिक्की

18

comm आपका दोस्त है:

NAME comm - दो क्रमित फ़ाइलों की तुलना लाइन द्वारा करें

SYNOPSIS कॉम [विकल्प] ... FILE1 FILE2

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

   With  no  options, produce three-column output.  Column one contains lines unique to FILE1, column two contains
   lines unique to FILE2, and column three contains lines common to both files.

   -1     suppress column 1 (lines unique to FILE1)

   -2     suppress column 2 (lines unique to FILE2)

   -3     suppress column 3 (lines that appear in both files)

( commशायद इसका प्रदर्शन लाभ होगा grepक्योंकि यह क्रमबद्धता को ध्यान में रखता है।)

उदाहरण के लिए:

comm -1 -3 file.txt bigfile.txt > newbigfile.txt

2
सॉर्ट किए गए सूचियों के लिए कम ओवर का उपयोग करने के बारे में अच्छी बात है। यह एक बेहतर जवाब होगा यदि आपने एक विशिष्ट कमांड लाइन उदाहरण दिया जैसेcomm -1 -3 file.txt bigfile.txt > newbigfile.txt
स्टीव मिडग्ली

मैं पुष्टि करता हूं कि मैंने grep कमांड को 100MB के आसपास की फाइलों के साथ रिपोर्ट करने का प्रयास किया था और मुझे "मारी गई" त्रुटि मिली। कॉम के साथ प्रयास करना सफलतापूर्वक समाप्त हो गया।
गियानलुका कासती

कमांड रिडायरेक्शन comm -1 -3 <(sort BAD.txt GOOD.txt) <(sort FILES.txt)
अनसोल्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.