用名称标记树文件
Marking tree file with a name
我有一个像这样的Newick/Phylip格式文件
(Chicken:0.247775,
Mouse:0.091619,
(GuineaPig:0.174006,
((OwlMonkey:0.069823,
((Chimp:0.009091,
Human:0.009091):0.025108,
GreenMonkey:0.018831):0.015025):0.029561,
((Sheep:0.087386,
Pig:0.039886):0.022893,
Dog:0.068016):0.005950):0.023011):0.006297);
我需要将分支 Dog 标记为 Dog:0.068016#Del
(Chicken:0.247775,
Mouse:0.091619,
(GuineaPig:0.174006,
((OwlMonkey:0.069823,
((Chimp:0.009091,
Human:0.009091):0.025108,
GreenMonkey:0.018831):0.015025):0.029561,
((Sheep:0.087386,
Pig:0.039886):0.022893,
Dog:0.068016#Del):0.005950):0.023011):0.006297);
这可以通过 sed 's/Dog:0.068016/Dog:0.068016#Del/g'
轻松完成
但是我有多个具有不同值的文件并且还必须对其他动物进行多次更改所以我尝试了以下方式
sed '/'Dog'/s/Dog/#Del/'
但是没有用。有什么建议吗?
如果你要修改的数据在一个名为 myFile
的文件中,你的动物是简单的单词(只是字母),每行一个,在一个名为 list
的文件中,那么你可以做什么你想要在 GNU sed
的 shell 循环中,因为你已经开始了:
cat list | while read animal; do
sed -E 's/\<('"$animal"':[0-9.]*)/#Del/' myFile > "$animal".out
done
对于列表中的每个 animal
,将创建一个名为 animal.out
的文件,其中包含修改后的数据。
GNU sed
命令使用扩展正则表达式 (-E
)。
要搜索和替换的正则表达式 (\<('"$animal"':[0-9.]*)
) 以单词开头 (\<
) 开头,这样动物名称就不会与另一个名称中间的任何地方匹配。左括号开始记录匹配的子表达式;右括号结束录音。我们使用单引号和双引号来扩展 shell 变量 animal
(1)。然后我们找到一个冒号,后跟任意数量的数字或句点 ([0-9.]*
).
替换表达式使用第一个(也是唯一一个)记录的匹配子表达式 (</code>)。</p>
<p>我们可以改进正则表达式中与动物名称后面的数字相匹配的部分:<code>[0-9]*\.[0-9]*
以保证它只包含一个句点。如果您对这些数字了解更多,我们可以更具体:[0-9]+\.[0-9]+
如果句点前后至少有一个数字。
(1) 如果你的动物名字真的很简单,那么 $animal
两边的双引号就没用了;但双引号这种参数扩展是一种很好的做法,它不会造成伤害。
使用一次 GNU awk 调用(针对 gensub() 和单词边界)一次更新任意数量的目标:
$ cat tst.awk
BEGIN {
split(t,tmp)
for (i in tmp) {
tgts[tmp[i]]
}
}
{
for (tgt in tgts) {
[=10=] = gensub("\<(" tgt ":[0-9.]+)","\1#Del",1)
}
print
}
$ awk -v t='Dog' -f tst.awk file
(Chicken:0.247775,
Mouse:0.091619,
(GuineaPig:0.174006,
((OwlMonkey:0.069823,
((Chimp:0.009091,
Human:0.009091):0.025108,
GreenMonkey:0.018831):0.015025):0.029561,
((Sheep:0.087386,
Pig:0.039886):0.022893,
Dog:0.068016#Del):0.005950):0.023011):0.006297);
$ awk -v t='Dog Human Mouse' -f tst.awk file
(Chicken:0.247775,
Mouse:0.091619#Del,
(GuineaPig:0.174006,
((OwlMonkey:0.069823,
((Chimp:0.009091,
Human:0.009091#Del):0.025108,
GreenMonkey:0.018831):0.015025):0.029561,
((Sheep:0.087386,
Pig:0.039886):0.022893,
Dog:0.068016#Del):0.005950):0.023011):0.006297);
我有一个像这样的Newick/Phylip格式文件
(Chicken:0.247775,
Mouse:0.091619,
(GuineaPig:0.174006,
((OwlMonkey:0.069823,
((Chimp:0.009091,
Human:0.009091):0.025108,
GreenMonkey:0.018831):0.015025):0.029561,
((Sheep:0.087386,
Pig:0.039886):0.022893,
Dog:0.068016):0.005950):0.023011):0.006297);
我需要将分支 Dog 标记为 Dog:0.068016#Del
(Chicken:0.247775,
Mouse:0.091619,
(GuineaPig:0.174006,
((OwlMonkey:0.069823,
((Chimp:0.009091,
Human:0.009091):0.025108,
GreenMonkey:0.018831):0.015025):0.029561,
((Sheep:0.087386,
Pig:0.039886):0.022893,
Dog:0.068016#Del):0.005950):0.023011):0.006297);
这可以通过 sed 's/Dog:0.068016/Dog:0.068016#Del/g'
但是我有多个具有不同值的文件并且还必须对其他动物进行多次更改所以我尝试了以下方式
sed '/'Dog'/s/Dog/#Del/'
但是没有用。有什么建议吗?
如果你要修改的数据在一个名为 myFile
的文件中,你的动物是简单的单词(只是字母),每行一个,在一个名为 list
的文件中,那么你可以做什么你想要在 GNU sed
的 shell 循环中,因为你已经开始了:
cat list | while read animal; do
sed -E 's/\<('"$animal"':[0-9.]*)/#Del/' myFile > "$animal".out
done
对于列表中的每个 animal
,将创建一个名为 animal.out
的文件,其中包含修改后的数据。
GNU sed
命令使用扩展正则表达式 (-E
)。
要搜索和替换的正则表达式 (\<('"$animal"':[0-9.]*)
) 以单词开头 (\<
) 开头,这样动物名称就不会与另一个名称中间的任何地方匹配。左括号开始记录匹配的子表达式;右括号结束录音。我们使用单引号和双引号来扩展 shell 变量 animal
(1)。然后我们找到一个冒号,后跟任意数量的数字或句点 ([0-9.]*
).
替换表达式使用第一个(也是唯一一个)记录的匹配子表达式 (</code>)。</p>
<p>我们可以改进正则表达式中与动物名称后面的数字相匹配的部分:<code>[0-9]*\.[0-9]*
以保证它只包含一个句点。如果您对这些数字了解更多,我们可以更具体:[0-9]+\.[0-9]+
如果句点前后至少有一个数字。
(1) 如果你的动物名字真的很简单,那么 $animal
两边的双引号就没用了;但双引号这种参数扩展是一种很好的做法,它不会造成伤害。
使用一次 GNU awk 调用(针对 gensub() 和单词边界)一次更新任意数量的目标:
$ cat tst.awk
BEGIN {
split(t,tmp)
for (i in tmp) {
tgts[tmp[i]]
}
}
{
for (tgt in tgts) {
[=10=] = gensub("\<(" tgt ":[0-9.]+)","\1#Del",1)
}
print
}
$ awk -v t='Dog' -f tst.awk file
(Chicken:0.247775,
Mouse:0.091619,
(GuineaPig:0.174006,
((OwlMonkey:0.069823,
((Chimp:0.009091,
Human:0.009091):0.025108,
GreenMonkey:0.018831):0.015025):0.029561,
((Sheep:0.087386,
Pig:0.039886):0.022893,
Dog:0.068016#Del):0.005950):0.023011):0.006297);
$ awk -v t='Dog Human Mouse' -f tst.awk file
(Chicken:0.247775,
Mouse:0.091619#Del,
(GuineaPig:0.174006,
((OwlMonkey:0.069823,
((Chimp:0.009091,
Human:0.009091#Del):0.025108,
GreenMonkey:0.018831):0.015025):0.029561,
((Sheep:0.087386,
Pig:0.039886):0.022893,
Dog:0.068016#Del):0.005950):0.023011):0.006297);