请求编写Awk脚本:基于指定条件跨文件填充字段
实现需求的Awk脚本方案
我来帮你搞定这个跨文件匹配的Awk脚本,完全贴合你的需求逻辑:
核心思路
- 先遍历文件2,把「follow doc(第2列)」作为键,「predecessor(第1列)」作为值,存到一个关联数组里,这样后续查找能直接快速匹配。
- 再遍历文件1,对每一行检查:如果第1列是
INV且第2列是CAN,就用该行第3列的documentnumber去数组里找对应的predecessor,替换到第4列;其他行保持原样输出。
完整Awk脚本
BEGIN { # 这里设置字段分隔符和输出分隔符,根据你的实际文件格式调整 # 如果是逗号分隔的CSV,改成 FS=","; OFS="," FS = "\t" OFS = "\t" } # 处理第一个输入文件(文件2),构建映射表 NR == FNR { follow_doc_map[$2] = $1 next } # 处理第二个输入文件(文件1),完成匹配替换 { # 检查目标条件 if ($1 == "INV" && $2 == "CAN") { # 找到匹配值就替换第4列,没找到则保留原第4列内容(可按需修改) $4 = (follow_doc_map[$3] != "") ? follow_doc_map[$3] : $4 } # 输出修改后的行 print $0 }
使用方法
把上面的代码保存成match_docs.awk,然后在终端执行:
awk -f match_docs.awk 文件2.txt 文件1.txt > 更新后的文件1.txt
⚠️ 注意:文件顺序不能搞反,必须先写文件2,再写文件1,这样Awk才会先构建映射表再处理文件1。
自定义调整提示
- 字段分隔符:如果你的文件是空格分隔(默认),可以删掉BEGIN块里的FS/OFS设置;如果是CSV,改成
FS=","; OFS=","。 - 空值处理:如果文件2里找不到对应documentnumber时,想把第4列设为空字符串,把脚本里的
$4 = (follow_doc_map[$3] != "") ? follow_doc_map[$3] : $4改成$4 = follow_doc_map[$3]即可。 - 列索引确认:确保你的文件列顺序和需求描述完全一致(比如文件1的第3列确实是documentnumber),如果列位置不对,调整脚本里的
$1/$2等数字即可。
内容的提问来源于stack exchange,提问作者as7951
相关产品推荐
相关产品推荐

