"|" वैकल्पिक ऑपरेटर


96

निम्नलिखित AT5G60410.gff नामक एक बड़ी फ़ाइल का एक नमूना है:

Chr5    TAIR10  gene    24294890    24301147    .   +   .   ID=AT5G60410;Note=protein_coding_gene;Name=AT5G60410
Chr5    TAIR10  mRNA    24294890    24301147    .   +   .   ID=AT5G60410.1;Parent=AT5G60410;Name=AT5G60410.1;Index=1
Chr5    TAIR10  protein 24295226    24300671    .   +   .   ID=AT5G60410.1-Protein;Name=AT5G60410.1;Derives_from=AT5G60410.1
Chr5    TAIR10  exon    24294890    24295035    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  five_prime_UTR  24294890    24295035    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  exon    24295134    24295249    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  five_prime_UTR  24295134    24295225    .   +   .   Parent=AT5G60410.1
Chr5    TAIR10  CDS 24295226    24295249    .   +   0   Parent=AT5G60410.1,AT5G60410.1-Protein;
Chr5    TAIR10  exon    24295518    24295598    .   +   .   Parent=AT5G60410.1

मुझे grep के उपयोग से विशिष्ट लाइनें निकालने में कुछ परेशानी हो रही है। मैं उन सभी लाइनों को निकालना चाहता था जो तीसरे कॉलम में निर्दिष्ट "जीन" या टाइप "एक्सॉन" हैं। जब यह काम नहीं आया तो मैं हैरान था:

grep 'gene|exon' AT5G60410.gff

कोई परिणाम नहीं लौटाए जाते हैं। मैं कहाँ पर गलत हो गया?


8
egrepइसके बजाय कोशिश करें ।
कीथ

उदाहरण के लिए, Perl का उपयोग करने वाले रेगेक्स की तरह करीब है? (यह वह है जो मैंने पहले इस्तेमाल किया है)
मैटलबेक

जवाबों:


136

तुम से बचने की जरूरत है |। निम्नलिखित को काम करना चाहिए।

grep "gene\|exon" AT5G60410.gff

argh, अभी एहसास हुआ कि मैं grep में उपयोग के लिए गलत rexx ट्यूटोरियल का अनुसरण कर रहा था। मैं कहीं भी एक अच्छा grep खोजने के लिए प्रतीत नहीं कर सकता। इसके लिए धन्यवाद!
मैटलबेक

50

डिफ़ॉल्ट रूप से, grep सामान्य वर्णों को सामान्य वर्णों के रूप में मानता है जब तक कि वे बच न जाएं। तो आप निम्नलिखित का उपयोग कर सकते हैं:

grep 'gene\|exon' AT5G60410.gff

हालाँकि, आप निम्न रूपों का उपयोग करके अपने मोड को बदल सकते हैं जो आप उम्मीद कर रहे हैं:

egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff

28

यह कुछ विकल्पों के लिए अलग करने का एक अलग तरीका है:

grep -e gene -e exon AT5G60410.gff

-eस्विच निर्दिष्ट विभिन्न पैटर्न मिलान करने के लिए।


अब सवाल यह है कि तेज क्या है? क्या कोई जानता है?
स्टालिंको

1
@stalinko: आपको यह timeपता लगाने के लिए कमांड का उपयोग करने में सक्षम होना चाहिए ।
नाथन फेलमैन

2

यह काम करेगा:

grep "gene\|exon" AT5G60410.gff

2
इस उत्तर का कौन सा मूल्य है जो इस stackoverflow.com/a/6775943/3933332 के पास नहीं है?
रिज़ियर

3
@ Rizier123 - टाइमस्टैम्प को देखें, दोनों ने लगभग समान समय पर एक ही उत्तर के साथ उत्तर दिया।
xnnboy

हाँ, बस एक मिनट देर से। फिर भी, मैं एक उत्तर को हटा दूंगा जो उत्कीर्ण उत्तर के समान है। खासकर अगर मेरी बेल्ट के नीचे 40k प्रतिष्ठा थी।
अत्तिला सीसिपक

0

जबकि एक विशेष समस्या मैं एक को शामिल हो रही थी के लिए googling मैं इस सवाल पाया पाइप आदेश एक करने के लिएgrep कि रेगेक्स में अल्टरनेशन ऑपरेटर का उपयोग करता था, इसलिए मैंने सोचा कि मैं अपने अधिक विशिष्ट उत्तर में योगदान दूंगा।

मुझे जो त्रुटि का सामना करना पड़ा, वह पिछले पाइप ऑपरेटर (यानी |) के साथ था और वैकल्पिक ऑपरेटर (यानी |पाइप ऑपरेटर के समान) के साथ grep regex में बिल्कुल भी नहीं था। मेरे लिए उत्तर ठीक से बचना था और आवश्यक विशेष शैल पात्रों जैसे कि & कि मुद्दे को संभालने से पहले मेरे grep regex के साथ था जिसमें अल्टरनेशन ऑपरेटर शामिल था।

उदाहरण के लिए, मैंने अपने स्थानीय मशीन पर जो कमांड निष्पादित की वह थी:

get http://localhost/foobar-& | grep "fizz\|buzz"

इस कमांड के परिणामस्वरूप निम्न त्रुटि हुई:

-bash: syntax error near unexpected token `|'

मेरी कमांड को बदलकर इस त्रुटि को ठीक किया गया:

get "http://localhost/foobar-&" | grep "fizz\|buzz"

&दोहरे उद्धरण के साथ चरित्र से बचकर मैं अपने मुद्दे को हल करने में सक्षम था। जवाब का वैकल्पिक ऑपरेशन से कोई लेना-देना नहीं था।

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