用另一个字典文件中的值替换文件中的每个单词

时间:2017-03-23 18:19:38

标签: linux shell awk sed grep

我有一个文本文件mytext.txt,文本的每一行都是一个句子:

the quick brown fox jumps over the lazy dog
colorless green ideas sleep furiously

然后我有一个字典文件dict.txt,如下所示:

the: A
quick: B
brown: C
fox: D
jumps: E
over: F
lazy: G
dog: H
colorless: I
green: J
ideas: K
sleep: L
furiously: M

我想将mytext.txt中的每个单词替换为dict.txt中的值,如下所示:

A B C D E F A G H
I J K L M

如何使用awk或sed进行操作?

3 个答案:

答案 0 :(得分:1)

如果你的dict.txt没有任何特殊的字符,一个非常快速的解决方案是将dict.txt的内容转换为sed表达式:

sed 's#^#s/#;s#: #/#;s#$#/g;#' dict.txt

将导致

s/the/A/g;
s/quick/B/g;
s/brown/C/g;
s/fox/D/g;
s/jumps/E/g;
s/over/F/g;
s/lazy/G/g;
s/dog/H/g;
s/colorless/I/g;
s/green/J/g;
s/ideas/K/g;
s/sleep/L/g;
s/furiously/M/g;

现在这可以用于另一个sed:

sed -f <(sed 's#^#s/#;s#: #/#;s#$#/g;#' dict.txt) mytext.txt

输出:

A B C D E F A G H
I J K L M

但请注意,dict文件是否包含sed / \ . * a.s.o.的特殊字符。它工作

修改:将g添加到sed

更新

如果只需要替换整个单词,那么这就行了,因为\b会查找单词boundarys:

sed -f <(sed 's#^#s/\\b#;s#: #\\b/#;s#$#/g;#' dict.txt) mytext.txt

thx @ jm666指出这一点。

EDIT2:

如果dict.txt文件很长,我的原始版本可能会失败。 @SLePort的版本解决了这个问题。 我之前使用的是"$()"而不是-f <()

答案 1 :(得分:0)

$ awk -F'[: ]' 'FNR==NR{a[$1]=$NF;next}{for(i in a)gsub(i,a[i])}1' dist mytext

$ awk -F'[: ]' 'FNR==NR{ a[$1]=$NF; next }
  { for(i=1;i<=NF;i++) if($i in a)$i=a[$i] }1' dist mytext

<强>输入

$ cat mytext 
the quick brown fox jumps over the lazy dog
colorless green ideas sleep furiously

$ cat dist 
the: A
quick: B
brown: C
fox: D
jumps: E
over: F
lazy: G
dog: H
colorless: I
green: J
ideas: K
sleep: L
furiously: M

<强>输出

$ awk -F'[: ]' 'FNR==NR{a[$1]=$NF;next}{for(i in a)gsub(i,a[i])}1' dist mytext 
A B C D E F A G H
I J K L M

$ awk -F'[: ]' 'FNR==NR{a[$1]=$NF; next}
{ for(i=1; i<=NF;i++) if($i in a)$i=a[$i] }1' dist mytext 
A B C D E F A G H
I J K L M

答案 2 :(得分:0)

这是awksed

的另一种选择
$ sed -f <(awk -F': ' '{print "s/\\b" $1 "\\b/" $2 "/g"}' dict) file

A B C D E F A G H
I J K L M