如何泛化支持N个文件的CSV合并并新增来源列的awk程序?
通用CSV合并并添加来源标识的awk方案
核心思路
通过命令行参数传递新增列名,以及每个文件对应的标识(格式为标识:文件名),让awk自动识别每个文件的来源标记,无需修改脚本即可处理任意数量的CSV文件。
实现脚本(merge_csv.awk)
BEGIN { FS = "," OFS = "," # 解析命令行参数:提取标识与文件名的映射,同时更新ARGV列表 for (i = 1; i < ARGC; i++) { if (split(ARGV[i], parts, ":") == 2) { file_tag[parts[2]] = parts[1] ARGV[i] = parts[2] } } # 标记第一个文件,用于处理表头 first_file = 1 } # 处理表头:仅在第一个文件输出时添加新增列名 FNR == 1 { if (first_file) { print $0, col_name first_file = 0 } next } # 处理数据行:追加对应文件的来源标识 { print $0, file_tag[FILENAME] }
使用方法
命令格式
awk -v col_name="来源标识" -f merge_csv.awk 标识1:文件1.csv 标识2:文件2.csv ... 标识N:文件N.csv
示例
假设现有两个CSV文件:
- numbers.csv内容:
id,value 1,100 2,200
- letters.csv内容:
id,char 1,A 2,B
执行合并命令:
awk -v col_name="source" -f merge_csv.awk num:numbers.csv let:letters.csv
输出结果:
id,value,source 1,100,num 2,200,num 1,A,let 2,B,let
关键说明
-v col_name="来源标识":自定义新增列的名称,可按需修改。标识:文件名格式:给每个文件绑定专属来源标识,用冒号分隔,awk会自动拆分并关联两者。- 表头处理:仅在第一个文件输出时追加新增列名,避免重复输出表头。
- 扩展性:支持任意数量的CSV文件,无需改动awk脚本本身。
内容的提问来源于stack exchange,提问作者PerseP
相关产品推荐
相关产品推荐

