如何提取文件名中的日期作为CSV列并合并多个CSV文件?
解决方案:提取日期并合并CSV文件
你可以通过在bash中先提取日期字符串,再传递给awk处理,这样比在awk里复杂处理路径更简单可靠。同时修正表头处理和CSV结构的问题,避免column -t破坏CSV格式。
修改后的完整脚本:
#!/bin/bash # 创建合并目录,-p避免目录已存在时报错 mkdir -p data/1.merged # 遍历所有原始CSV文件 for i in data/0.Raw/*.csv; do # 从文件名提取日期:去掉路径和后缀,直接得到YYYYMMDD date_str=$(basename "$i" _data.csv) # 处理单个文件:给表头添加Date列,数据行添加日期作为第一列 awk -F, -v OFS=, -v date="$date_str" ' NR == 1 { print "Date," $0 } # 表头新增Date列 NR > 1 { print date "," $0 } # 数据行前插入日期 ' "$i" > "data/1.merged/$(basename "$i")" done # 合并所有处理后的文件:仅保留第一个文件的表头,跳过其余文件的表头 awk 'FNR == 1 && NR > 1 { next } 1' data/1.merged/*.csv > data/1.merged/all_files.csv # 清理中间生成的单个文件 rm data/1.merged/*.csv
关键修改点说明:
提取日期字符串:
用basename "$i" _data.csv直接从文件名中剥离路径和_data.csv后缀,比如data/0.Raw/20240520_data.csv会直接得到20240520,比awk正则处理更直观不易出错。修正表头处理:
原来的脚本没有给新增的日期列添加表头,现在在第一行(表头)前插入Date,,保证CSV结构规范,后续工具解析时能识别日期列。移除
column -t:column -t是用来格式化文本对齐的,但会破坏CSV的逗号分隔结构(比如遇到包含空格的字段时会错误拆分),CSV文件不需要对齐,直接输出原始逗号分隔内容即可。合并时去重表头:
用awk 'FNR == 1 && NR > 1 { next } 1'实现:仅保留第一个文件的表头,后续文件的表头直接跳过,避免合并后出现重复表头。
如果你执意要在awk内部处理文件名提取日期,可以用以下正则写法替换原来的FILENAME处理逻辑:
# 在awk中直接提取日期 date_str = gensub(/.*\/([0-9]{8})_data.csv/, "\\1", 1, FILENAME)
这个正则会匹配路径末尾的8位数字(YYYYMMDD)并提取出来,不过还是推荐用bash的basename更简洁。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

