Bash:用列表中的另一个单词替换单词

时间:2015-09-23 22:08:31

标签: bash sed

我尝试编写一个脚本,根据列表文件用另一个相应的单词替换文件的每个单词。

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命令中没有正则表达式。

如果你能提供帮助我真的很感激

1 个答案:

答案 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)