使用awk按DDBB主键关联不同行数文件的问题排查(Part2)
问题说明
需在bash环境下对两个CSV文件以DDBB字段为主键做关联,现有awk脚本逻辑错误,无法输出正确结果,未匹配记录会丢失。
输入文件
- file1(字段:
DDBB,size,PATH,存储库大小、路径信息):
DDBB,size,PATH stream,0,/databases/stream/ambit stream,10,/databases/stream/tables_pks stream,100,/databases/stream/scenario stream,200,/databases/stream/selection stream,3000,/databases/stream/election_block aroa_bi,4000,/databases/aroa_bi/selection_filter aroa_bi,10000,/databases/aroa_bi/validity stream,50,/databases/stream/alidity_t arquitectura_test,60,/databases/arquitectura_test/3a_backfilling_competitor_company_basket arquitectura_prod,18000,/databases/arquitectura_prod/3a_backfilling_competitor_company_family
- file2(字段:
DOMAIN,DDBB,存储域名与库名映射关系):
DOMAIN,DDBB mm,stream aroa,aroa_bi arquitectura,arquitectura_test arquitectura,arquitectura_prod
预期输出file3
字段顺序为PATH,DOMAIN,size,file1全量记录保留:
PATH,DOMAIN,size /databases/stream/ambit,mm,0 /databases/stream/tables_pks,mm,10 /databases/stream/scenario,mm,100 /databases/stream/selection,mm,200 /databases/stream/election_block,mm,3000 /databases/aroa_bi/selection_filter,aroa,4000 /databases/aroa_bi/validity,aroa,10000 /databases/stream/alidity_t,mm,50 /databases/arquitectura_test/basket,arquitectura,60 /databases/arquitectura_prod/family,arquitectura,18000
原有脚本错误排查
现有awk脚本存在3个核心逻辑错误:
- 文件读取顺序颠倒:
NR==FNR块会优先处理传入的第一个文件,脚本传入顺序是file1 file2,但该块逻辑是存储DDBB与DOMAIN的映射关系,应该优先读存映射的file2,再读存明细的file1。 - 字段索引完全错配:
- 处理file2时,DDBB是第2列、DOMAIN是第1列,映射应该存为
a[DDBB列值] = DOMAIN列值即a[$2]=$1,原脚本写反成a[$1]=$2。 - 处理file1时,DDBB是第1列、size是第2列、PATH是第3列,应该用
a[$1]取对应的DOMAIN值,原脚本误用a[$3]、a[$2]取值,完全匹配不上。
- 处理file2时,DDBB是第2列、DOMAIN是第1列,映射应该存为
- 冗余逻辑+未跳过表头:两个文件首行都是表头,原脚本未做跳过处理,会把表头当数据匹配;END块中输出
NewFiles的逻辑不符合需求,会额外输出无关内容。
修正后可用脚本
awk ' BEGIN { FS=OFS="," } # 读取file2,构建DDBB到DOMAIN的映射,跳过表头行 NR==FNR { if(FNR>1) a[$2] = $1 next } # 处理file1首行,输出自定义表头 FNR==1 { print "PATH,DOMAIN,size" next } # 处理file1数据行,匹配不到DOMAIN时默认填充Unknown,可按需修改默认值 { dom = ($1 in a) ? a[$1] : "Unknown" print $3, dom, $2 } ' file2 file1 > file3
说明:你给出的预期输出最后两条PATH和file1原始路径不一致,属于示例笔误,上述脚本会保留file1中的原始PATH值,如果需要截取路径片段可自行添加字符串处理规则。
内容的提问来源于stack exchange,提问作者Skiel
相关产品推荐
相关产品推荐

