You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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个核心逻辑错误:

  1. 文件读取顺序颠倒:NR==FNR块会优先处理传入的第一个文件,脚本传入顺序是file1 file2,但该块逻辑是存储DDBB与DOMAIN的映射关系,应该优先读存映射的file2,再读存明细的file1。
  2. 字段索引完全错配:
    • 处理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]取值,完全匹配不上。
  3. 冗余逻辑+未跳过表头:两个文件首行都是表头,原脚本未做跳过处理,会把表头当数据匹配;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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 09:18:18