2013-02-25 91 views
9

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

#!/bin/ksh 
file="/home/nimish/contents.txt" 

while read -r line; do 
    grep $line /home/nimish/another_file.csv 
done < "$file" 

मैं स्क्रिप्ट पर कार्य कर रहा हूँ, लेकिन यह दिखाई नहीं दे रहा सीएसवी फ़ाइल से सामग्री। मेरी content.txt फ़ाइल में "08915673" या "123223" जैसी संख्याएं हैं जो सीएसवी फ़ाइल में भी मौजूद हैं। क्या मैं कुछ गलत कर रहा हूँ?

+2

प्रत्येक फ़ाइल से 2 लाइनों और उन इनपुटों को अपेक्षित आउटपुट शामिल करने के लिए अपने प्रश्न को संपादित करने पर विचार करें। सौभाग्य। – shellter

+1

उपरोक्त आपकी स्क्रिप्ट वहां नाम रिकॉर्ड करने के अलावा 'फ़ाइल' चर का उपयोग नहीं करती है। 'रीड-आर लाइन <$ फ़ाइल के दौरान' कोशिश करें; do'। उस ने कहा, 'ksh' बेकार है और मैंने यह जांच नहीं की है कि यह' -r' के साथ क्या करता है यह जानने के लिए कि यह काम करेगा या नहीं। इसके अलावा, 'grep' नियमित अभिव्यक्तियों की अपेक्षा करेगा और आपके पास मौजूद संख्याओं से मेल खाने वाले किसी भी मूल्य से मेल खाएगा, भले ही सीएसवी फ़ाइल में लाइन के अन्य प्रमुख या पीछे वाले अंक हों: आप' grep -w' या इसी तरह के हो सकते हैं। –

उत्तर

27

grep स्वयं ऐसा करने में सक्षम है। सीधे शब्दों में झंडा -f का उपयोग करें:

grep -f <patterns> <file> 

<patterns> प्रत्येक पंक्ति में एक पैटर्न वाली फ़ाइल है, और <file> वह फ़ाइल है जिसमें आप चीज़ें खोजना चाहते हैं।

ध्यान दें कि, प्रत्येक पंक्ति को एक पैटर्न पर विचार करने के लिए grep को मजबूर करने के लिए, भले ही प्रत्येक पंक्ति की सामग्री नियमित अभिव्यक्ति की तरह दिखाई दे, आपको ध्वज -F, --fixed-strings का उपयोग करना चाहिए।

grep -F -f <patterns> <file> 

यदि आपकी फ़ाइल एक सीएसवी है, जैसा कि आप ने कहा, आप ऐसा कर सकते हैं:

grep -f <(tr ',' '\n' < data.csv) <file> 

उदाहरण के लिए, फ़ाइल "a.txt", निम्नलिखित लाइनों के साथ पर विचार करें:

alpha 
0891234 
beta 
अब

, फ़ाइल "b.txt", लाइनों के साथ:

Alpha 
0808080 
0891234 
bEtA 

निम्न आदेश का आउटपुट है:

grep -f "a.txt" "b.txt" 
0891234 

आप सब पर for -loop यहाँ की जरूरत नहीं है; grep स्वयं ही इस सुविधा को प्रदान करता है।


अब अपनी फ़ाइल नाम का उपयोग:

#!/bin/bash 
patterns="/home/nimish/contents.txt" 
search="/home/nimish/another_file.csv" 
grep -f <(tr ',' '\n' < "${patterns}") "${search}" 

आप विभाजक आप अपनी फ़ाइल में है करने के लिए ',' बदल सकते हैं।

+0

इसलिए यदि मैं = $ लाइन का सदस्यता लेता हूं तो grep -f काम करेगा? –

+0

तो grep -f के साथ यह त्रुटि देता है ".rep: 0652-033 नहीं खोल सकता:" –

+0

ठीक है, फ़ाइल पथ के साथ समस्या प्रतीत होती है। क्या आप वाकई सही हैं? डबल कोट्स के साथ फ़ाइल नाम को गले लगाने का प्रयास करें। आप इसे निष्पादित करने का प्रयास कैसे कर रहे हैं। कृपया, उस कमांड लाइन को जोड़ें जिसे आप अगली टिप्पणी में चलाने की कोशिश कर रहे हैं। – Rubens

2

एक अन्य समाधान:

  • उपयोग awk, अपने खुद के hash (जैसे ahash), सभी अपने आप से नियंत्रण पैदा करते हैं।
  • $0 to $i को प्रतिस्थापित करें, आप अपने इच्छित फ़ील्ड से मेल खा सकते हैं।

awk -F"," ' 
{ 
    if (nowfile==""){ nowfile = FILENAME; } 

    if(FILENAME == nowfile) 
    { 
    hash[$0]=$0; 
    } 
    else 
    { 
     if($0 ~ hash[$0]) 
     { 
      print $0 
     } 
    } 
} ' xx yy 
1

मैं तुम सच में तुम क्या करने की कोशिश कर रहे हैं क्या प्रदर्शन करने के लिए एक स्क्रिप्ट की जरूरत नहीं लगता।

एक आदेश पर्याप्त है।("," विभाजक के रूप में के साथ)

grep -f <(awk -F";" '{print $11}' FILE_TO_EXTRACT_PATTERNS_FROM.csv) TARGET_FILE.csv

मुझे आशा है कि इस मदद करता है मेरे मामले में, में एक csv फ़ाइल में 11 कॉलम में एक पहचान संख्या की जरूरत है।