借助Awk脚本按参考文件更新商品价格并生成多输出文件遇阻
问题排查与解决:根据参考文件批量更新商品价格并生成输出文件
需求说明
- 有一份包含商品ID和当前价格的主文件
- 需要依据参考文件(每行格式:
Item# NewPrice OutFile)更新对应商品价格 - 最终生成与参考文件行数一致的输出文件(共4个),每个文件仅调整目标商品的价格,其余商品保留主文件原有价格
文件内容
主文件(格式:Item 商品ID 当前价格)
Item 1 20 Item 2 30 Item 3 40
参考文件(格式:商品ID 新价格 输出文件名)
1 22 It1_22 1 25 It1_25 2 32 It2_32 3 45 It3_45
预期输出(共4个文件)
- It1_22
Item,1,22 Item,2,30 Item,3,40
- It1_25
Item,1,25 Item,2,30 Item,3,40
- It2_32
Item,1,20 Item,2,32 Item,3,40
- It3_45
Item,1,20 Item,2,30 Item,3,45
错误脚本及问题分析
用户提供的无法生成任何目标文件的脚本:
awk 'BEGIN{OFS=","};FNR == NR{a[$1]=$2;d=$3;next} $2 in a{print $1,$2,a[$2];next}1' ref main > d
问题点:
- 逻辑方向错误:脚本仅将主文件处理后输出到单个文件
d,完全没实现为参考文件每行生成独立输出文件的需求 - 数据存储错误:遍历参考文件时,数组
a和变量d会被逐行覆盖,最终仅保留参考文件最后一行的内容 - 匹配逻辑错误:主文件商品ID对应
$2,但脚本的匹配与输出逻辑无法对应参考文件每行的独立更新要求
正确解决方案
使用以下Awk脚本,先存储主文件的所有商品数据,再针对参考文件的每一行生成对应输出文件:
# 读取主文件,存储商品ID-价格映射,同时保存每行原始结构 NR == FNR { item_id = $2 price[item_id] = $3 lines[++line_cnt] = $0 next } # 处理参考文件的每一行,生成对应输出文件 { target_id = $1 new_price = $2 out_file = $3 OFS = "," # 遍历主文件内容,替换目标商品价格后写入输出文件 for (i=1; i<=line_cnt; i++) { split(lines[i], parts) if (parts[2] == target_id) { print parts[1], parts[2], new_price > out_file } else { print parts[1], parts[2], price[parts[2]] > out_file } } close(out_file) }
使用方式
将脚本保存为update_price.awk,执行以下命令:
awk -f update_price.awk main ref
执行后会自动生成符合预期的4个输出文件。
内容的提问来源于stack exchange,提问作者EverLearner
相关产品推荐
相关产品推荐

