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

借助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

问题点:

  1. 逻辑方向错误:脚本仅将主文件处理后输出到单个文件d,完全没实现为参考文件每行生成独立输出文件的需求
  2. 数据存储错误:遍历参考文件时,数组a和变量d会被逐行覆盖,最终仅保留参考文件最后一行的内容
  3. 匹配逻辑错误:主文件商品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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 12:17:28