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

请求编写Awk脚本:按条件计算列总和并更新Invoicevalue列

搞定你的Awk数据处理需求!

我专门给你写了一套Awk处理方案,完美匹配你说的场景,还兼顾了数据安全(避免直接修改原文件搞砸数据)。

核心思路拆解

要实现你的需求,得分两步走:

  • 第一步:先扫一遍文件,统计每个DocumentNo(第一列)出现的次数;
  • 第二步:再扫一遍文件,对符合条件的行(DocumentNo仅出现一次 + Line列值为10),计算第3-6列的总和,替换第8列的Invoicevalue。

完整脚本及使用方法

方法一:用独立Awk脚本文件(适合重复使用)

先创建一个名为process_invoice.awk的文件,内容如下:

# 第一次遍历:统计每个DocumentNo的出现次数
NR == FNR {
    count[$1]++
    next
}

# 第二次遍历:处理每行数据
{
    # 检查触发条件:DocumentNo仅出现一次,且Line值为10
    if (count[$1] == 1 && $2 == 10) {
        # 计算第3到6列的总和
        total = $3 + $4 + $5 + $6
        # 替换第8列的Invoicevalue
        $8 = total
    }
    # 输出处理后的行
    print $0
}

然后执行以下命令(把your_data_file.txt换成你实际的文件名):

awk -f process_invoice.awk your_data_file.txt your_data_file.txt > temp_file.txt && mv temp_file.txt your_data_file.txt

方法二:一行命令搞定(适合临时快速处理)

如果不想创建脚本文件,直接用这条命令:

awk 'NR==FNR{count[$1]++;next} {if(count[$1]==1 && $2==10){$8=$3+$4+$5+$6} print $0}' your_data_file.txt your_data_file.txt > temp.txt && mv temp.txt your_data_file.txt

关键细节说明

  • NR==FNR技巧:这是Awk里区分两次遍历同一文件的经典写法,第一次遍历只做次数统计,第二次才开始处理数据;
  • count[$1]++:用数组记录每个DocumentNo的出现频次;
  • 临时文件过渡:先把处理结果写到临时文件,确认没问题再替换原文件,防止中途出错导致原文件损坏;
  • 若你的文件是逗号分隔的CSV格式,记得加上-F ','参数,比如:
    awk -F ',' -f process_invoice.awk your_data.csv your_data.csv > temp.csv && mv temp.csv your_data.csv
    

额外提醒

确保第3-6列都是数值类型,如果有非数值内容,Awk会自动转成0,要是这不符合你的预期,得提前做数据清洗哦。

内容的提问来源于stack exchange,提问作者as7951

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:54:22