grepping โดยใช้“ |” ตัวดำเนินการทางเลือก


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 ฉันต้องการแยกบรรทัดทั้งหมดที่เป็นประเภท "ยีน" หรือประเภท "exon" ซึ่งระบุไว้ในคอลัมน์ที่สาม ฉันแปลกใจเมื่อสิ่งนี้ไม่ได้ผล:

grep 'gene|exon' AT5G60410.gff

ไม่มีการส่งคืนผลลัพธ์ ฉันผิดพลาดตรงไหน?


8
ลองegrepแทน
Keith

egrep ใกล้เคียงกับ regex ที่ Perl ใช้หรือไม่? (นี่คือสิ่งที่ฉันเคยใช้มาก่อน)
MattLBeck

คำตอบ:


136

คุณต้องหนี|. ต่อไปนี้ควรทำงาน

grep "gene\|exon" AT5G60410.gff

อ๊ะเพิ่งรู้ว่าฉันทำตามบทช่วยสอน regex ที่ไม่ถูกต้องเพื่อใช้ใน grep ฉันไม่สามารถหา grep ที่ดีได้จากทุกที่ ขอบคุณสำหรับสิ่งนี้!
MattLBeck

51

ตามค่าเริ่มต้น grep ถือว่าอักขระพิเศษทั่วไปเป็นอักขระปกติเว้นแต่จะมีการใช้ Escape คุณสามารถใช้สิ่งต่อไปนี้:

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สวิทช์ระบุรูปแบบที่แตกต่างกันจะมีการแข่งขัน


ตอนนี้คำถามคืออะไรเร็วกว่ากัน? มีใครรู้บ้าง?
Stalinko

1
@stalinko: คุณควรจะสามารถใช้timeคำสั่งเพื่อค้นหา
Nathan Fellman

2

สิ่งนี้จะได้ผล:

grep "gene\|exon" AT5G60410.gff

2
ซึ่งมีมูลค่าไม่คำตอบนี้มีที่นี้stackoverflow.com/a/6775943/3933332ไม่ได้?
Rizier123

3
@ Rizier123 - ดูการประทับเวลาทั้งสองตอบในเวลาที่ใกล้เคียงกันโดยมีคำตอบเดียวกัน
xmnboy

ใช่ช้าไปแค่นาทีเดียว ถึงกระนั้นฉันจะลบคำตอบที่เหมือนกับคำตอบที่ได้รับการโหวต โดยเฉพาะอย่างยิ่งถ้ามีชื่อเสียง 40k ภายใต้เข็มขัดของฉัน
Attila Csipak

0

ฉันพบคำถามนี้ในขณะที่ googling สำหรับปัญหาเฉพาะที่ฉันมีเกี่ยวกับคำสั่ง pipedกับgrepคำสั่งที่ใช้ตัวดำเนินการทางเลือกใน regex ดังนั้นฉันจึงคิดว่าฉันจะให้คำตอบที่เฉพาะเจาะจงมากขึ้น

ข้อผิดพลาดที่ฉันพบกลายเป็นกับตัวดำเนินการไปป์ก่อนหน้านี้ (เช่น|) ไม่ใช่ตัวดำเนินการสำรอง (เช่น|เดียวกับตัวดำเนินการไปป์) ใน grep regex เลย คำตอบสำหรับฉันคือการหลีกเลี่ยงอย่างเหมาะสมและอ้างเป็นอักขระเชลล์พิเศษที่จำเป็นเช่น &ก่อนที่จะสมมติว่าปัญหาเกิดจาก grep regex ของฉันที่เกี่ยวข้องกับตัวดำเนินการสำรอง

ตัวอย่างเช่นคำสั่งที่ฉันดำเนินการบนเครื่องท้องถิ่นของฉันคือ:

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

คำสั่งนี้ทำให้เกิดข้อผิดพลาดต่อไปนี้:

-bash: syntax error near unexpected token `|'

ข้อผิดพลาดนี้ได้รับการแก้ไขโดยเปลี่ยนคำสั่งของฉันเป็น:

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

การหลีกเลี่ยง&อักขระด้วยเครื่องหมายคำพูดคู่ฉันสามารถแก้ไขปัญหาของฉันได้ คำตอบไม่มีส่วนเกี่ยวข้องกับการดำเนินการสลับเลย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.