![](/img/trans.png)
[英]Combine two grep commands to process input from a file or grep lines starting with one specific substring and contain another after
[英]grep one liner - extract two different lines from same file
我有一個包含許多行的文件,如下所示。
== domain 1 score: 280.5 bits; conditional E-value: 2.1e-87
TSEEETTCTTTGSG---BTTSSB-HHHHHHHHHHHHHHHHHHSSS---B-HHHHHHHSTTTSTGCGBB-HHHHHHHHHHHTEBEBTTTS---SSCSESECTTGCGSCEBEESEEEEEESSBHHHHHHHHHHHSSEEEEEECTSHHHHTEESSEESCTSCETSS-EEEEEEEEEEEETTEEEEEEE-SBTTTSTBTTEEEEESSSSSGGGTTSSEEEE CS
PF00112.18 2 pesvDwrekkgavtpvkdqgsCGsCWafsavgalegrlaiktkkklvslSeqelvdCskeenegCnGGlmenafeyikknggivtekdypYkakekgkCkkkkkkekvakikgygkvkenseealkkalakngPvsvaidaseedfqlYksGvyketecsktelnhavlivGygvengkkyWivkNsWgtdwgekGYiriargknnecgieseavyp 218
p+svD+r+k+ +vtpvk+qg+CGsCWafs+vgaleg+l+ kt +kl++lS q+lvdC + en+gC GG+m+naf+y++kn+gi++e+ ypY ++e ++C ++ + + ak++gy++++e +e+alk+a+a++gPvsvaidas ++fq+Y++Gvy++++c++++lnhavl+vGyg ++g+k Wi+kNsWg++wg+kGYi +ar+knn cgi++ a++p
1AU0:A 2 PDSVDYRKKG-YVTPVKNQGQCGSCWAFSSVGALEGQLKKKT-GKLLNLSPQNLVDCVS-ENDGCGGGYMTNAFQYVQKNRGIDSEDAYPYVGQE-ESCMYNPTGKA-AKCRGYREIPEGNEKALKRAVARVGPVSVAIDASLTSFQFYSKGVYYDESCNSDNLNHAVLAVGYGIQKGNKHWIIKNSWGENWGNKGYILMARNKNNACGIANLASFP 213
我只想提取PF前面的行和它后面以數字開頭的相關行。
在這種情況下,以 PF PF00112.18
的行是“ PF00112.18
”,以數字開頭的行是“ 1AU0:A
”。 下一個域的這些 id 會改變,但PF
是恆定的,其關聯的 id 以數字開頭。
這是我用grep
嘗試過的,我希望這個 oneliner 一定有錯誤。 任何幫助將不勝感激。
grep '^ PF \| \d' inFile.txt
預期輸出:
PF00112.18 2 pesvDwrekkgavtpvkdqgsCGsCWafsavgalegrlaiktkkklvslSeqelvdCskeenegCnGGlmenafeyikknggivtekdypYkakekgkCkkkkkkekvakikgygkvkenseealkkalakngPvsvaidaseedfqlYksGvyketecsktelnhavlivGygvengkkyWivkNsWgtdwgekGYiriargknnecgieseavyp 218
1AU0:A 2 PDSVDYRKKG-YVTPVKNQGQCGSCWAFSSVGALEGQLKKKT-GKLLNLSPQNLVDCVS-ENDGCGGGYMTNAFQYVQKNRGIDSEDAYPYVGQE-ESCMYNPTGKA-AKCRGYREIPEGNEKALKRAVARVGPVSVAIDASLTSFQFYSKGVYYDESCNSDNLNHAVLAVGYGIQKGNKHWIIKNSWGENWGNKGYILMARNKNNACGIANLASFP 213
您可以使用以下grep
表達式:
grep '^[[:space:]]\+PF\|^[[:space:]]\+[[:digit:]]' input.txt
第一個模式^[[:space:]]\\+PF
搜索開頭包含一個或多個空格的行,后跟術語PF
。 第二個模式也在行的開頭搜索一個或多個空格,但后跟一個數字。
這可以簡化為:
grep '^[[:space:]]\+\(PF\|[[:digit:]]\)' input.txt
因為這兩種模式都以行首的一個或多個空格開頭。
最后讓我建議使用egrep
而不是grep
因為擴展的 POSIX 正則表達式將節省使用一些轉義:
egrep '^[[:space:]]+(PF|[[:digit:]])' input.txt
egrep "^[ \t]*(PF|[0-9]).*$" tmp_file
[ \\t]相當於一個空格。 它是制表符分隔符。
所以^[ \\t]*抓取任何以空格開頭的東西。 此后星號將占據所有領先的空白。
(PF|[0-9]).*$將抓取以 PF 或數字開頭的行。 egrep 的美妙之處在於你可以指定多個用括號封裝的條件,用管道分隔。
.*$抓取每行直到行尾
所以(PF|[0-9]).*$將抓取以 PF 或數字開頭的所有內容,直到行尾。 如果不首先補償領先的空白,它將無法工作。
所以我們得到:
egrep "^[ \t]*(PF|[0-9]).*$" tmp_file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.