मैं किसी फ़ाइल से मेल खाने वाली पंक्तियों और गैर-मेल वाली लाइनों को एक अलग फ़ाइल में कैसे पुनर्निर्देशित कर सकता हूँ?


13

क्या कोई स्क्रिप्ट / कार्यक्रम / उपयोगिता निम्नलिखित आवश्यकता के लिए पहले से ही अनुकूलित तरीके से उपलब्ध है?

someCommand |
   tee >(grep "pattern" > LinesWhichMatch) |
   grep -v "pattern" > LinesWhichDoesNotMatch

जवाबों:


16

आप उसके लिए उपयोग कर सकते हैं awk

command | awk '{ if (/pattern/) { print > "match" } else { print > "nomatch" } }'

1
मैं पूरी तरह से परिचित नहीं हूँ awkलेकिन यह किस बिंदु पर मूल्यांकन करता है >? यदि यह सशर्त लागू होने पर हर बार मूल्यांकन किया जाता है, तो आप दो एक-लाइन फ़ाइलों के साथ हवा देंगे ...
Shadur

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

10

यहाँ एक sedउदाहरण है:
नोट: सेड का wकमांड स्क्रिप्ट को चलाने पर हर बार एक मौजूदा फ़ाइल को अधिलेखित करेगा, लेकिन केवल अगर वह विशेष रूप से लिखने की कमांड चालू हो; इसलिएrm

rm -f file-{yes,not}  
sed -ne '/pattern/bY; w file-not' -e 'b; :Y; w file-yes' file

अच्छा लगा। बिना शाखा के:sed -n '/PATTERN/p;//! w file-not' infile >file-yes
don_crissti

6

आप फ़ाइलों को awk में जोड़ सकते हैं:

awk '{if (/pattern/) print >>"matched"; else print >>"unmatched"; }

या इससे कम:

awk '{print >>(/pattern/?"matched":"unmatched")}'

उनके उदाहरण से पता चलता है कि यदि वे मौजूद हैं, तो वे फाइलों को ओवरराइट करना चाहते हैं, न कि अपेंडेंट को।
क्रिस डाउन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.