grepping menggunakan "|" operator alternatif

96

Berikut ini adalah contoh file besar bernama 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

Saya mengalami masalah dalam mengekstrak baris tertentu dari ini menggunakan grep. Saya ingin mengekstrak semua baris yang berjenis "gen" atau jenis "exon", yang ditentukan di kolom ketiga. Saya terkejut saat ini tidak berhasil:

grep 'gene|exon' AT5G60410.gff

Tidak ada hasil yang dikembalikan. Di mana kesalahan saya?

MattLBeck
sumber
8
Coba egrepsaja.
Keith
apakah egrep lebih dekat dengan jenis regex yang digunakan Perl? (Ini yang pernah saya gunakan sebelumnya)
MattLBeck

Jawaban:

136

Anda harus keluar dari |. Yang berikut harus melakukan pekerjaan itu.

grep "gene\|exon" AT5G60410.gff
Jeff Foster
sumber
argh, baru sadar saya mengikuti tutorial regex yang salah untuk digunakan di grep. Sepertinya saya tidak bisa menemukan grep yang bagus di mana pun. Terima kasih untuk ini!
MattLBeck
51

Secara default, grep memperlakukan karakter khusus sebagai karakter normal kecuali jika karakter tersebut di-escape. Jadi Anda bisa menggunakan yang berikut ini:

grep 'gene\|exon' AT5G60410.gff

Namun, Anda dapat mengubah modenya dengan menggunakan formulir berikut ini untuk melakukan apa yang Anda harapkan:

egrep 'gene|exon' AT5G60410.gff
grep -E 'gene|exon' AT5G60410.gff
a'r
sumber
28

Ini adalah cara berbeda dalam memahami beberapa pilihan:

grep -e gene -e exon AT5G60410.gff

yang -epola beralih menspesifikasikan berbeda untuk mencocokkan.

Nathan Fellman
sumber
sekarang pertanyaannya adalah apa yang lebih cepat? apakah ada yang tahu
Stalinko
1
@stalinko: Anda harus dapat menggunakan timeperintah untuk mencari tahu.
Nathan Fellman
2

Ini akan berhasil:

grep "gene\|exon" AT5G60410.gff
ennuikiller
sumber
2
Nilai manakah yang dimiliki jawaban ini yang tidak dimiliki stackoverflow.com/a/6775943/3933332 ini?
Rizier123
3
@ Rizier123 - lihat stempel waktunya, keduanya menjawab pada waktu yang hampir sama dengan jawaban yang sama.
xmnboy
Yup, terlambat satu menit. Namun, saya akan menghapus jawaban yang identik dengan jawaban yang diberi suara positif. Apalagi jika ada reputasi 40k di bawah ikat pinggang saya.
Attila Csipak
0

Saya menemukan pertanyaan ini saat mencari di Google untuk masalah tertentu yang saya alami melibatkan perintah yang disalurkan ke grepperintah yang menggunakan operator pergantian dalam regex, jadi saya pikir saya akan memberikan jawaban yang lebih terspesialisasi.

Kesalahan yang saya hadapi ternyata dengan operator pipa sebelumnya (yaitu |) dan bukan operator pergantian (yaitu |identik dengan operator pipa) di grep regex sama sekali. Jawaban bagi saya adalah dengan benar melarikan diri dan mengutip karakter shell khusus yang diperlukan seperti & sebelum mengasumsikan masalahnya ada pada regex grep saya yang melibatkan operator pergantian.

Misalnya, perintah yang saya jalankan di mesin lokal saya adalah:

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

Perintah ini menghasilkan kesalahan berikut:

-bash: syntax error near unexpected token `|'

Kesalahan ini diperbaiki dengan mengubah perintah saya menjadi:

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

Dengan keluar dari &karakter dengan tanda kutip ganda, saya dapat menyelesaikan masalah saya. Jawabannya sama sekali tidak ada hubungannya dengan operasi pergantian.

entpnerd
sumber