我尝试编写一个脚本,根据列表文件用另一个相应的单词替换文件的每个单词。
phylofile
(要修改的文件)是:
(((swallowtail,noctuid):90,pyraloid):74,crambine)
namefile
(从旧词到新词的映射列表)是:
crambine orocrambus
swallowtail papilio
noctuid catocala
输出应为:
(((papilio,catocala):90,pyraloid):74,orocrambus)
我希望它更清楚
我写了以下脚本:
echo -n "Enter the path to the file where names should be changed: "
read phylofile
echo -n "Enter the path to the file containing the string searched and the replacing string: "
read namefile
while read var
do
searchstring=`echo "$var"|awk -F= '{print $1}'`
replacestring=`echo "$var"|awk -F= '{print $2}'`
sed "s/$searchstring/$replacestring/g" $phylofile > outputfile
done < $namefile
我收到一条错误消息(法语),这意味着sed命令中没有正则表达式。
如果你能提供帮助我真的很感激
答案 0 :(得分:0)
这就是你需要的东西:
echo -n "Enter the path to the file where names should be changed: "
read phylofile
echo -n "Enter the path to the file containing the string searched and the replacing string: "
read namefile
awk '
NR==FNR{ map["\\<"$1"\\>"]=$2; next }
{
for (old in map) {
new = map[old]
gsub(old,new)
}
print
}
' "$namefile" "$phylofile"
但如果没有一些样本输入和预期输出,很难准确说出你需要什么。
以上使用GNU awk进行单词边界。
鉴于您新发布的样本输入文件:
$ cat namefile
crambine orocrambus
swallowtail papilio
noctuid catocala
$ cat phylofile
(((swallowtail,noctuid):90,pyraloid):74,crambine)
这是运行在它们上面的awk脚本:
$ awk '
NR==FNR{ map["\\<"$1"\\>"]=$2; next }
{
for (old in map) {
new = map[old]
gsub(old,new)
}
print
}
' namefile phylofile
(((papilio,catocala):90,pyraloid):74,orocrambus)