我的文件包含许多行,如下所示。
== 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
'和以数字开头的行是' 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
答案 0 :(得分:1)
您可以使用以下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
答案 1 :(得分:0)
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