我有一个文本文件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进行操作?
答案 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)
这是awk
和sed
$ 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