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。我可以使用sub和gsub,但是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)
可以使用fedorqui在注释中建议的更通用的方法来处理input和dict文件中名称的不匹配,例如,
awk 'FNR==NR {dict[$1]=$2; next} {$1=($1 in dict) ? dict[$1] : $1}1' dict input
Run Code Online (Sandbox Code Playgroud)
我下面的原始解决方案适用于input和dict文件之间没有丢失映射的情况。
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"等的哈希表。一旦构建了哈希表,现在就可以查看字典文件,以查看匹配的行以及文件$1中dict的哈希值input。如果找到匹配项,则根据需要打印内容。