删除每列以模式结尾的字符串

删除每列以模式结尾的字符串

我想删除文件中随机出现的 (L=6), (L=7).....(L=12) 的所有条目,格式如下;

我的输入文件:

TRINITY_DN1910_c0_g1_i13    GO:0005975(L=2) GO:0006022(L=4) GO:0006026(L=5) GO:0006030(L=9) GO:0006032(L=11)    GO:0006040(L=6)
TRINITY_DN1452_c0_g1_i11    GO:0005975(L=3) GO:0006022(L=9) GO:0006026(L=12)    GO:0006030(L=2) GO:0006032(L=4) GO:0006040(L=5)

                                        

该文件以制表符分隔。

预期产出

TRINITY_DN1910_c0_g1_i13    GO:0005975(L=2) GO:0006022(L=4) GO:0006026(L=5)
TRINITY_DN1452_c0_g1_i11    GO:0005975(L=3) GO:0006030(L=2) GO:0006032(L=4) GO:0006040(L=5) 

答案1

您可以使用sed以下方法来完成此操作:

sed 's/GO:[^   ]*(L=[6-9])//g
     s/GO:[^ ]*(L=1[0-2])//g' filename

您可以通过按 输入制表符<ctrl-v><tab>。这就是我在方括号中以 开头的内容^

答案2

在每个 Unix 机器上的任何 shell 中使用任何 awk:

$ awk '
    BEGIN {
        for (i=6; i<=12; i++) {
            re = re sep i
            sep = "|"
        }
        re = "\t[^\t]+[(]L=(" re ")[)]"
    }
    {
        gsub(re,"")
        print
    }
' file
TRINITY_DN1910_c0_g1_i13        GO:0005975(L=2) GO:0006022(L=4) GO:0006026(L=5)
TRINITY_DN1452_c0_g1_i11        GO:0005975(L=3) GO:0006030(L=2) GO:0006032(L=4) GO:0006040(L=5)

如果您有任何其他连续的数字范围需要处理,只需更改循环中的开始/结束数字即可。如果您有不连续的数字,只需re在 中设置BEGIN,但是对这些数字有意义,例如,一个选项可能是将循环替换为re = "7|12|957|1045"

答案3

awk '{gsub(/\s*\S*L=([6-9]|1[0-9])\)/, "")}1' file

答案4

使用(以前称为 Perl_6)

raku -ne '.=words; print .[0] ~ "\t"; \
      put $_.skip.grep( { / "(L=" (\d+) ")" $ / && $0 < 6 } ).join: "\t";'  

示例输入(制表符分隔的列):

TRINITY_DN1910_c0_g1_i13    GO:0005975(L=2) GO:0006022(L=4) GO:0006026(L=5) GO:0006030(L=9) GO:0006032(L=11)    GO:0006040(L=6)
TRINITY_DN1452_c0_g1_i11    GO:0005975(L=3) GO:0006022(L=9) GO:0006026(L=12)    GO:0006030(L=2) GO:0006032(L=4) GO:0006040(L=5)

示例输出(制表符分隔的列):

TRINITY_DN1910_c0_g1_i13    GO:0005975(L=2) GO:0006022(L=4) GO:0006026(L=5)
TRINITY_DN1452_c0_g1_i11    GO:0005975(L=3) GO:0006030(L=2) GO:0006032(L=4) GO:0006040(L=5)
  • 简而言之,使用非自动打印逐行标志读取行-ne

  • .=words使用例程将输入分解为以空格分隔的列, 其中.=运算符将结果元素保存回 Raku 的$_主题变量(.=words是 的简写$_ = $_.words),

  • 在第二条语句中,打印第一列,后跟 \t制表符,然后

  • 最后,在第三条语句中,第一个元素被跳过(因为它已经被打印),并grep用于返回首先匹配"(L=" (\d+) ")" $&& $0 < 6捕获$0 值小于 6 的元素。

https://raku.org

相关内容