删除第一行,直到列中的正则表达式出现

时间:2016-09-18 15:16:51

标签: regex shell awk

我有一些使用以下

按顺序排列的行
grep ENSG00000006114 File | sort -V 
chr17   35874900    35879174    ABCD0000006114:I25  -
chr17   35874901    35879174    ABCD0000006114:I25  -
chr17   35875548    35875671    ABCD0000006114:E27  -
chr17   35875672    35877289    ABCD0000006114:I26  -
chr17   35877290    35877445    ABCD0000006114:E26  -
chr17   35877446    35877932    ABCD0000006114:I25  -

但是我想要删除包含'的第一行:I'在第一行直到我得到':E'因为我一直在尝试像

这样的东西
grep ENSG00000006114 File | sort -V | awk '{if ($4 ~ /:I/ && NR==1) next};1'

但是,对于前几行,可能会出现多次出现,因此如何排除包含以下内容的行:I直到第一行:E出现在第一行,这样我的最终结果将是:

   chr17   35875548    35875671    ABCD0000006114:E27  -
   chr17   35875672    35877289    ABCD0000006114:I26  -
   chr17   35877290    35877445    ABCD0000006114:E26  -
   chr17   35877446    35877932    ABCD0000006114:I25  -

3 个答案:

答案 0 :(得分:4)

假设由于您的输入文件很大,grep + sort在该顺序中很有用,您只需要从awk获取:

grep ENSG00000006114 File | sort -V | awk '$4~/:E/{f=1} f'

如果文件不大,你可能会失去grep:

sort -V File | awk '!/ENSG00000006114/{next} $4~/:E/{f=1} f'

答案 1 :(得分:3)

你可以使用这个awk:

grep ENSG00000006114 File | sort -V |
awk 'p==1 && $4 ~ /:E/{p=2} !p && $4 ~ /:I/{p=1} p==1{next} 1'

chr17   35875548    35875671    ABCD0000006114:E27  -
chr17   35875672    35877289    ABCD0000006114:I26  -
chr17   35877290    35877445    ABCD0000006114:E26  -
chr17   35877446    35877932    ABCD0000006114:I25  -
  • p==0&& $4匹配:I,然后我们设置p=1
  • p==1我们跳过该记录并转到下一个
  • p==1&& $4匹配:E,然后我们设置p=2,从而允许打印剩余记录。

答案 2 :(得分:1)

您也可以将其重定向回grep

$ grep ENSG00000006114 File | sort -V  | grep -A 10000000000000000 :E
chr17   35875548    35875671    ABCD0000006114:E27  -
chr17   35875672    35877289    ABCD0000006114:I26  -
chr17   35877290    35877445    ABCD0000006114:E26  -
chr17   35877446    35877932    ABCD0000006114:I25  -