grep one liner - 从同一个文件中提取两个不同的行

时间:2015-06-15 12:01:05

标签: bash grep

我的文件包含许多行,如下所示。

  == 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

2 个答案:

答案 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