आप एक सूची में किसी अन्य सूची से मूल्यों की सभी घटनाओं को कैसे हटाते हैं?


2

मेरे पास प्रतीकों की एक सूची है जैसे ...

wer
sfe
efo

मैं (गैर-विशिष्ट) प्रतीकों की एक और सूची से इन (अद्वितीय) प्रतीकों के सभी उदाहरणों को कैसे निकालूं?

तो निम्नलिखित सूची में, लाइनों के साथ शुरू wer दो बार हटाया जाएगा, और sfe एक बार:

wer-alskjdfi
efr-4siosejf
rte-alskjdfs
wer-alskjsef
sfe-ooskjdfi

हर दूसरी पंक्ति को अछूता होना चाहिए, प्रतीक और वर्ण के बाद "

efr-4siosejf
rte-alskjdfs

मुझे इसे sed / awk / grep / bash या अन्य कमांड लाइन टूल्स का उपयोग करके करना होगा। मुझे पता है कि एक समय में एक मान को खोजने और निकालने के लिए एक sed कमांड कैसे लिखा जाता है, लेकिन मैं इसे 100k + मान के लिए कैसे करूं?

जवाबों:


1

क्या होगा अगर फ़ाइल 2 में उन प्रतीकों में से प्रत्येक के बाद वर्ण हैं? मैं भी ऐसा ही करना चाहता हूं लेकिन अनुगामी पात्रों को रखना।

ठीक है, एक प्रति बनाएँ file2 केवल वही फ़ील्ड है जिसे आप फ़िल्टर करना चाहते हैं और, अगर करंट है file2 "गैर-अद्वितीय प्रतीक" है हाथोंहाथ पीछा किया "अनुगामी पात्रों" द्वारा (उदा।, efr-42, rte-17, आदि।), की एक और प्रति बनाओ file2 जहां वे अंतरिक्ष से अलग होते हैं। आपके द्वारा दिए गए उदाहरण डेटा के आधार पर उदाहरण कमांड हैं:

sed 's/\(...\).*/\1/'        file2.sorted > file2.symbol_only
sed 's/\(...\)\(.*\)/\1 \2/' file2.sorted > file2.separated

या

sed 's/\([^-]*\)-.*/\1/'        file2.sorted > file2.symbol_only
sed 's/\([^-]*\)\(-.*\)/\1 \2/' file2.sorted > file2.separated

… आपके प्रश्न में जोड़े गए नए डेटा के आधार पर फिर उपयोग करें comm पहले जैसा:

comm -13 file1.sorted file2.symbol_only > file2.no_match

... और अनुगामी पात्रों के साथ प्रतीकों को मिलाएं

join file2.no_match file2.separated

यदि आवश्यक हो, तो दूसरे का उपयोग करें sed आपके द्वारा जोड़े गए रिक्त स्थान को निकालने के लिए।


यह मेरे लिए होता है कि आप आउटपुट फ़ाइल को वापस पाने के लिए इस ट्रिक पर निर्माण कर सकते हैं file2 मूल आदेश।

  1. मूल की एक प्रति तैयार करें file2 लाइन नंबरों के साथ।
  2. प्रतीकों के दाईं ओर रेखा संख्याओं को फेरबदल करें।
  3. (उपरोक्त, के साथ शुरू sort आदेशों)
  4. मूल पंक्ति संख्या पर आउटपुट को क्रमबद्ध करें।
  5. लाइन नंबरों को स्ट्रिप करें।

अगर आपको इसकी मदद चाहिए तो मुझे बताएं।


2

अपनी सूचियों को फ़ाइलों में रहते मान लें

awk -F- 'NR==FNR {exclude[$1]++; next} !($1 in exclude)' list_of_symbols filename

grep भी एक विकल्प है

grep -v -f <(sed 's/^/^/' list_of_symbols) filename

सेड बिट प्रत्येक लाइन की शुरुआत में एक रेगीक्स एंकर जोड़ता है।


1

क्या आपको अपनी दूसरी फ़ाइल का क्रम बनाए रखने की आवश्यकता है? क्या आप अधिकतम बार बता सकते हैं कि एक पंक्ति को दोहराया जा सकता है? यदि दोनों प्रश्नों के उत्तर "नहीं" हैं, तो मेरा सुझाव है comm:

sort file1 file1 > file1.sorted     sort file2 > file2.sorted
-------------------------------     -------------------------
efo                                 efr
efo                                 rte
sfe                                 sfe
sfe                                 wer
wer                                 wer
wer

comm -13 file1.sorted file2.sorted
efr
rte

की पर्याप्त प्रतियां शामिल करें file1 में file1.sorted किसी भी स्ट्रिंग की घटनाओं की अधिकतम संख्या को कवर करने के लिए file2


धन्यवाद स्कॉट। क्या होगा अगर फ़ाइल 2 में उन प्रतीकों में से प्रत्येक के बाद वर्ण हैं? मैं भी ऐसा ही करना चाहता हूं लेकिन अनुगामी पात्रों को रखना।
barrrista

0

SED आदि के बारे में कुछ भी जाने बिना, मेरे व्यक्तिगत छद्मकोड में मूल डिजाइन है:

निकाले जाने वाले तार की सूची को क्रमबद्ध करें (सूची ए)

उन स्ट्रिंग्स की सूची को सॉर्ट करें जिनमें हटाए जाने वाले आइटम हैं (सूची B)

सूची ए में प्रत्येक आइटम के लिए

Repeat until Item (List B) > Item (List A)
    if the Item (List B) equals Item (List A) 
        remove item (List B)
    next Item (List B)
Next Item (List A)

नोट: किसी आइटम को "हटाना" समस्यात्मक हो सकता है - इस पंक्ति को किसी नए में आइटम जोड़ने के साथ बदलने के लिए बेहतर है

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