我想删除文件中随机出现的 (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 的元素。