如何用Bash脚本匹配两个CSV文件行并累加Data列?
解决CSV文件按Account+Entity匹配累加Data的Bash方案
核心思路
利用Bash 4.0+支持的关联数组,将Account,Entity组合作为唯一键,对应存储Data的累加值。先读取第一个文件的所有数据存入数组,再读取第二个文件,匹配到已存在的键就累加Data,未匹配到则直接存入,最后输出合并后的结果。
完整脚本
#!/bin/bash # 初始化关联数组 declare -A data_map # 处理第一个CSV文件,跳过表头 while IFS=, read -r account entity data; do # 用"Account,Entity"作为数组键 key="$account,$entity" # 将Data值存入数组 data_map["$key"]=$data done < <(tail -n +2 csv_file1.csv) # 处理第二个CSV文件,跳过表头 while IFS=, read -r account entity data; do key="$account,$entity" # 如果键已存在,累加Data;否则直接赋值 if [[ -v data_map["$key"] ]]; then data_map["$key"]=$(( data_map["$key"] + data )) else data_map["$key"]=$data fi done < <(tail -n +2 csv_file2.csv) # 输出表头 echo "Account,Entity,Data" # 遍历关联数组,输出结果 for key in "${!data_map[@]}"; do echo "$key,${data_map[$key]}" done
关键部分解释
declare -A data_map:声明一个关联数组,用于存储键值对,键是Account,Entity,值是累加后的Data。IFS=, read -r account entity data:设置分隔符为逗号,逐行读取CSV的字段,-r避免转义字符被解析。tail -n +2:跳过CSV的第一行表头,只处理数据行。[[ -v data_map["$key"] ]]:检查数组中是否存在该键,存在则累加Data,否则新增键值对。
测试结果
用你提供的示例文件执行脚本后,输出如下:
Account,Entity,Data A1101,E101,3000 A1101,E102,2000
内容的提问来源于stack exchange,提问作者Ram Kashyap
相关产品推荐
相关产品推荐

