寻求Awk脚本处理三文件数据匹配替换及其他文件操作方案
多文件关联匹配的Awk实现方案及替代思路
我来帮你搞定这个跨文件数据关联的需求,用Awk就能高效完成,下面直接上可运行的脚本,再一步步拆解逻辑,最后给几个替代方案供你参考。
核心Awk脚本实现
假设你的三个文件都是空格分隔的(如果是逗号/制表符等其他分隔符,只需要修改-F参数即可,比如-F','指定逗号分隔),脚本如下:
#!/usr/bin/awk -f # 第一步:处理file2,构建Billdoc到price的映射数组 NR == FNR { billdoc_map[$1] = $2 next } # 第二步:处理file1,筛选符合条件的记录,构建price到documentnumber的映射 FNR == 1 && NR != FNR { # 切换到file1时跳过表头(如果没有表头可删除此行) next } $1 ~ /^(YMNC|YPBC)$/ { doc_num = $2 # 只保留在file2中能匹配到的documentnumber if (doc_num in billdoc_map) { price = billdoc_map[doc_num] price_doc_map[price] = doc_num # 用price做键,方便后续匹配file3 } } # 第三步:处理file3,匹配price并执行后续操作 FNR == 1 && NR != FNR { # 切换到file3时跳过表头(如果没有表头可删除此行) next } $1 in price_doc_map { # 示例操作:打印匹配到的关联信息 print "salesdoc=" $1 " 匹配成功,对应documentnumber:" price_doc_map[$1] # 这里替换成你的后续操作,比如修改字段、写入新文件、计算统计值等 }
脚本运行方式
- 把上面的代码保存为
match_data.awk,赋予执行权限:
chmod +x match_data.awk
- 按指定顺序运行脚本(必须先处理file2,再file1,最后file3):
./match_data.awk file2 file1 file3
逻辑拆解
- 处理file2:用
NR == FNR判断当前处理的是第一个输入文件(file2),把第1列(Billdoc)作为键,第2列(price)作为值存入数组,方便后续快速查找。 - 处理file1:切换到第二个文件后,筛选第1列是
YMNC或YPBC的记录,取出第2列的documentnumber,去file2的映射数组里找对应的price,再把price和documentnumber反向存入新数组(用price做键,方便file3匹配)。 - 处理file3:切换到第三个文件后,检查第1列(salesdoc)是否存在于price映射数组中,匹配成功就执行你需要的后续操作。
替代处理方案
如果不想用Awk,也可以用以下几种方式实现:
方案1:grep + join + sort(命令行工具组合)
适合简单场景,但注意join要求文件按关联列排序:
# 1. 从file1提取符合条件的documentnumber grep -E "^YMNC|^YPBC" file1 | awk '{print $2}' > doc_num.txt # 2. 关联file2得到对应price sort -k1,1 file2 > file2_sorted.txt sort doc_num.txt > doc_num_sorted.txt join doc_num_sorted.txt file2_sorted.txt | awk '{print $2}' > price_list.txt # 3. 关联file3匹配price sort -k1,1 file3 > file3_sorted.txt sort price_list.txt > price_sorted.txt join price_sorted.txt file3_sorted.txt
方案2:Python pandas脚本(易读性更高)
如果你熟悉Python,用pandas处理会更直观:
import pandas as pd # 读取文件(sep参数根据实际分隔符调整) df1 = pd.read_csv("file1", sep=" ", header=None, names=["billingtype", "documentnumber"]) df2 = pd.read_csv("file2", sep=" ", header=None, names=["Billdoc", "price"]) df3 = pd.read_csv("file3", sep=" ", header=None, names=["salesdoc", "other_fields"]) # 筛选file1的目标记录 filtered_df1 = df1[df1["billingtype"].isin(["YMNC", "YPBC"])] # 关联file1和file2 merged_df = pd.merge(filtered_df1, df2, left_on="documentnumber", right_on="Billdoc", how="inner") # 关联到file3并执行后续操作 final_df = pd.merge(df3, merged_df, left_on="salesdoc", right_on="price", how="inner") print(final_df) # final_df.to_csv("result.csv", index=False) # 保存结果到文件
内容的提问来源于stack exchange,提问作者as7951
相关产品推荐
相关产品推荐

