在文件中查找和替换单词

4

我有两个文件:file1file2

file2 中的任何匹配项都应该在 file1 中的单词后面添加“-W”。

File1:

Verb=Applaud,Beg,Deliver
Adjective=Bitter,Salty,Minty
Adverb=Quickly,Truthfully,Firmly

文件2:

Gate
Salty
Explain
Quickly
Hook
Deliver
Earn
Jones
Applaud
Take

输出:

Verb=Applaud-W,Beg,Deliver-W
Adjective=Bitter,Salty-W,Minty
Adverb=Quickly-W,Truthfully,Firmly

尝试但未能成功 并且可能需要很长时间:

for i in `cat file2` ; do
nawk -v DEE="$i" '{gsub(DEE, DEE"-W")}1' file1 > newfile
mv newfile file1
done

6
我们有很多想法,但我们更愿意先看看你的想法。这不是一个编程服务。 - fedorqui
我很抱歉我提问的方式不太好。我已经尝试了很多方法,但是一直无法得出一个合理的解决方案或者接近这个方案。 - user3437245
1
你具体卡在哪里了?你有想过解决方案吗?即使只是描述一下你打算如何解决问题的方式也可以。否则,我们会认为你没有努力自己解决问题。 - Tom Fenech
4个回答

2
这应该可以工作:
sed 's=^=s/\\b=;s=$=\\b/\&-W/g=' file2 | sed -f- file1

输出:

Verb=Applaud-W,Beg,Deliver-W
Adjective=Bitter,Salty-W,Minty
Adverb=Quickly-W,Truthfully,Firmly

在原地进行更改:

sed 's=^=s/\\b=;s=$=\\b/\&-W/g=' file2 | sed --in-place -f- file1

1

你的方法并不差,但是我更喜欢使用sed,因为它有一个原地修改的选项。

while read i
do
    sed -i "s/$i/$i-W/g" file1
done < file2

请注意,仅使用“-i”标志只适用于GNU sed,在其他平台或实现中可能无法按预期工作或根本无法工作。 - Eric Renouf

0
一个 awk:
awk 'BEGIN{FS=OFS=",";RS="=|\n"}
     NR==FNR{a[$1]++;next}
     {
        for (i=1;i<=NF;i++){
            $i=($i in a) ? $i"-W":$i
            }
        printf("%s%s",$0,FNR%2?"=":"\n")
    }'  file2 file1

结果

Verb=Applaud-W,Beg,Deliver-W
Adjective=Bitter,Salty-W,Minty
Adverb=Quickly-W,Truthfully,Firmly

0

这里有一个使用纯Bash的例子:

#!/bin/bash
while read line
do
    while read word
    do
        if [[ $line =~ $word ]]; then
            line="${line//$word/$word-W}"
        fi
    done < file2
    echo $line
done < file1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接