在awk中根据字典文件替换字符串

Ger*_*oge 3 unix bash awk sed

cat input

aaa paul peter
bbb john mike
ccc paul mike 
bbb paul john
Run Code Online (Sandbox Code Playgroud)

和我的字典文件字典:

cat dict

aaa OOO
bbb 111
ccc 222
Run Code Online (Sandbox Code Playgroud)

我需要找到字符串形式input,如果匹配文件中的第一列,则将dict第二列形式文件打印dict到第一列文件中input。我可以使用subgsub,但是dict文件中有数千行(使用不同的字母)。

cat output:

000 paul peter
111 john mike
222 paul mike 
111 paul john
Run Code Online (Sandbox Code Playgroud)

感谢您的任何帮助。

我的解决方案:

  awk:

awk '{sub(/aaa/,"000",$1); sub(/bbb/,"111",$1); sub(/ccc/,"222",$1)1' input
Run Code Online (Sandbox Code Playgroud)

更新:

如果在中找不到匹配input的内容dict,请保持第一列中的单词不变。

猫输入

aaa paul peter
bbb john mike
ccc paul mike 
bbb paul john
ddd paul peter

cat dict

aaa OOO
bbb 111
ccc 222

cat output:

000 paul peter
111 john mike
222 paul mike 
111 paul john
ddd paul peter
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 5

可以使用fedorqui在注释中建议的更通用的方法来处理inputdict文件中名称的不匹配,例如,

awk 'FNR==NR {dict[$1]=$2; next} {$1=($1 in dict) ? dict[$1] : $1}1' dict input
Run Code Online (Sandbox Code Playgroud)

我下面的原始解决方案适用于inputdict文件之间没有丢失映射的情况。

awk 'FNR==NR{hash[$2FS$3]=$1; next}{for (i in hash) if (match(hash[i],$1)){print $2, i} }' input dict
OOO paul peter
111 john mike
111 paul john
222 paul mike
Run Code Online (Sandbox Code Playgroud)

这个想法是创建一个索引为$2FS$3,值为$1,即hash["paul peter"]="aaa"等的哈希表。一旦构建了哈希表,现在就可以查看字典文件,以查看匹配的行以及文件$1dict的哈希值input。如果找到匹配项,则根据需要打印内容。