【问题标题】:remove a string between columns删除列之间的字符串
【发布时间】:2015-08-04 22:28:06
【问题描述】:

我正在尝试删除两个字符串之间的文本,但保留模式前后的所有数据。我正在使用的示例文本:

comp117_c0_seq1 len=214 path=[173:0-52 372:53-71 226:72-213]
comp143_c0_seq1 len=285 path=[263:0-226 490:227-284]
comp541_c0_seq1 len=230 path=[1:0-132 134:133-229]  gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76

所以目标是删除从“len”开始到“path = [...]”结束的文本。并保留该文本区域之前和之后的所有内容。 有人有什么建议吗。我希望输出看起来像:

comp117_c0_seq1 
comp117_c0_seq1
comp541_c0_seq1 gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76

提前致谢。

【问题讨论】:

  • 你有没有尝试过?这看起来很简单
  • 也发布预期的输出
  • 嗨,我正在尝试 awking 第一列并填充模式匹配,但我对 sed 的学习不太好,而且由于模式的长度可以变化,我不太确定去做吧。
  • 够简单sed -E 's/len.*path[^]]*\]//'
  • 或者因为 perl 可以识别非贪婪运算符并给出数据的形状:perl -pe 's/len.*?\]//'

标签: regex string awk sed


【解决方案1】:

使用sed

$ sed -r 's/len[^]]*]//' input_file
comp117_c0_seq1 
comp143_c0_seq1 
comp541_c0_seq1   gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76
  • len 匹配 len

  • [^]]* 否定字符类,匹配除] 以外的任何字符。

    * 量词,确保 ] 以外的任何东西 匹配零个或多个 tiems

  • ] 匹配] 结尾处的结尾path


使用awk

$ awk '{sub("len[^]]*]", "")}1' input
comp117_c0_seq1 
comp143_c0_seq1 
comp541_c0_seq1   gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76
  • sub(ere, repl[, in ]) 用字符串 repl 代替第一个实例 扩展正则表达式EREin 字符串输入并返回 替换次数。

  • 1 始终正确。 awk 采用默认操作打印整条记录。

【讨论】:

    【解决方案2】:

    从您的示例输入和输出中,您似乎想要删除从 len 到下一个 ] 的所有内容。来了(那是 BSD/Mac sed):

    sed -E 's/len[^]]*\]//'
    

    含义:替换len和每个不是]的字符,然后是]。这在遇到的第一个 ] 处停止。这是因为 sed 是贪婪的。 perl更懂:

    perl -pe 's/len.*?\]//'
    

    *? 是非贪婪运算符,因此它只吃下一个令牌不想要的任何东西。

    【讨论】:

      【解决方案3】:

      我会用 sed 来解决这个问题:

      cat file | sed -e 's/(^.*)len=.*path=\[[^\]*\](.*)$/\1\2/'
      

      不过,当您发布您的预期输出时,我可能需要修改它。

      【讨论】:

      • 好的,谢谢,我添加了预期的输出,并将试一试。感谢您的耐心等待,我刚刚开始学习编程。
      • 您在解决方案中不必要地使用了cat
      • 你真的不需要组捕获
      • 另外,\[.*\] 是贪婪的,所以当路径声明后有更多] 时,整个东西都被这个通配符吃掉了
      【解决方案4】:

      给定:

      $ echo "$tgt"
      comp117_c0_seq1 len=214 path=[173:0-52 372:53-71 226:72-213]
      comp143_c0_seq1 len=285 path=[263:0-226 490:227-284]
      comp541_c0_seq1 len=230 path=[1:0-132 134:133-229]  gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76
      

      Perl:

      $ echo "$tgt" | perl -lne 'print "$1$2" if /^(\w+)\slen=\d+\sp
      ath=\[[^\]]+?\](.*)$/'
      comp117_c0_seq1
      comp143_c0_seq1
      comp541_c0_seq1  gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76
      

      或者,

      $ echo "$tgt" | perl -lne 'print if s/len[^]]+\] *//'
      comp117_c0_seq1 
      comp143_c0_seq1 
      comp541_c0_seq1 gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76
      

      【讨论】:

        猜你喜欢
        • 2023-01-31
        • 1970-01-01
        • 2016-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        相关资源
        最近更新 更多