【问题标题】:Remove the first lines till the occurence of a regular expression in a column删除第一行,直到列中出现正则表达式
【发布时间】:2016-09-18 15:16:50
【问题描述】:

我有一些我使用以下命令整理的行

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  -

【问题讨论】:

    标签: regex shell awk


    【解决方案1】:

    假设由于您的输入文件非常庞大,因此 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'
    

    【讨论】:

    • 你给出了最优雅和最简单的解决方案来匹配 OP 的数据(因为 E 无论如何都不会在 I 之前)。
    【解决方案2】:

    你可以使用这个 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 从而允许打印剩余的记录。

    【讨论】:

    • 非常感谢(也为解释)..工作!
    • 这比它必须要复杂得多,请参阅stackoverflow.com/a/39559531/1745001。可能是喝咖啡的时间了;-)。
    • 似乎更复杂,因为 OP 只想在 $4 中从第一个 :I 跳过块到下一个 :E。如果没有:I,那么我们不需要跳过行,直到:E
    • @anubhava,很好。您提供的通用解决方案即使在 EI 之前也有效。
    【解决方案3】:

    您也可以直接将其重定向回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  -
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多