如何使用awk从另一文件的列更新目标文件的列
问题解决:用第二个文件更新第一个文件的对应内容
文件内容
第一个文件(file1)
1 AA 2 BB 3 CC 4 DD
第二个文件(file2)
15 AA 17 BB 20 CC 25 FF
期望输出
15 AA 17 BB 20 CC 4 DD
原脚本失效原因
你用的原脚本逻辑完全搞反了:
awk 'NR==FNR{a[$1]=$2;next}a[$1]{print $2,a[$1]}' file1 file2
- 它先读file1,把数字作为键存储字母,但我们需要的是以字母为匹配依据,用file2里的新数字替换file1对应字母的旧数字
- 输出逻辑也错误,只会输出匹配到的行,还把字段顺序搞混了
正确的Awk脚本
直接运行这个脚本就能得到期望结果:
awk 'NR==FNR{a[$2]=$1; next} {print ($2 in a ? a[$2] : $1), $2}' file2 file1
简单解释
- 先读取file2,把每行的字母(比如AA)作为键,对应的新数字(比如15)存入数组
a - 再读取file1,对每一行做判断:
- 如果当前行的字母在数组
a中存在,就输出对应的新数字+原字母 - 如果不存在,直接输出原行的数字+字母
- 如果当前行的字母在数组
如果要把结果直接覆盖回file1,建议先备份原文件,再用重定向:
awk 'NR==FNR{a[$2]=$1; next} {print ($2 in a ? a[$2] : $1), $2}' file2 file1 > temp && mv temp file1
内容的提问来源于stack exchange,提问作者sam_alloy
相关产品推荐
相关产品推荐

