簡體   English   中英

grep one liner - 從同一個文件中提取兩行不同的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM