![文本处理:将一行中的字符串替换为相应的字符串](https://linux22.com/image/100238/%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86%EF%BC%9A%E5%B0%86%E4%B8%80%E8%A1%8C%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%9B%BF%E6%8D%A2%E4%B8%BA%E7%9B%B8%E5%BA%94%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我有这些作为输入文件
文件1
Red + Yellow = Orange; Yellow + Blue = Green; Blue + Red = Violet
文件2
Red;1
Yellow;2
Blue;3
我在unix下做这个。
输出
文件3
1 + 2 = Orange; 2 + 3 = Green; 3 + 1 = Violet
答案1
awk 'NR == FNR { # First file
split($0,a,/;/)
#print "change " a[1] "to " a[2]
change[a[1]]=a[2]
}
NR != FNR {
for (i=1;i<NF;i++) {
if ($i in change) {
$i=change[$i]
}
}
print
}' file2 file1
使用 awk 习惯用法 NR != FNR 来判断这是第一个文件还是第二个文件。如果它是第一个文件,则分割该行;
并将映射存储在更改数组中。如果是第二个,则循环输入字段,如果有任何匹配,则替换为正确的更改。最后打印结果。
答案2
#!/bin/bash
IFS=";"
while read NAME VALUE
do
sed -i "s/${NAME}/${VALUE}/g" file1
done < file2