从CSV文件名提取时间字段并添加为列后合并文件的命令流实现
批量处理CSV文件并合并的一键命令方案
需求概述
需要处理一批命名格式为ZZ_OUTYYYY_MM_DD_HH_TT_SS_csvfile.csv的CSV文件,完成以下操作:
- 从文件名中提取
YYYY(年)、MM(月)、DD(日)、HH(时)、TT(分)、SS(秒)字段 - 将这些时间字段作为新列,添加到原有4列(列头为
ID, Name, OpenPrice, ClosePrice)的CSV文件中 - 最后合并所有处理后的文件,输出一个包含完整数据的CSV文件
现有手动处理命令
目前手动处理单个文件的AWK命令如下:
awk -F"," 'BEGIN { OFS = "," } {$4="2023_10_12_14_31_23" OFS $4; print}' ZZ_OUT2023_10_12_14_31_23_csvfile.csv > output123.csv
该命令仅能处理单个文件,且时间字段需手动填写,效率极低,需实现自动化批量处理。
一键命令流解决方案
以下命令可直接批量处理所有符合命名格式的CSV文件,并完成合并:
{ # 标记是否为第一个处理的文件(用于保留唯一表头) first_file=1 # 遍历所有目标CSV文件 for file in ZZ_OUT*_csvfile.csv; do # 从文件名提取时间字符串:ZZ_OUTYYYY_MM_DD_HH_TT_SS_csvfile.csv → YYYY_MM_DD_HH_TT_SS time_str=$(echo "$file" | sed -E 's/ZZ_OUT([0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{2}_[0-9]{2}_[0-9]{2})_csvfile.csv/\1/') # 将时间字符串分割为单独的年、月、日、时、分、秒变量 IFS="_" read -r yyyy mm dd hh tt ss <<< "$time_str" if [ $first_file -eq 1 ]; then # 处理第一个文件,添加新表头 awk -v y="$yyyy" -v m="$mm" -v d="$dd" -v h="$hh" -v t="$tt" -v s="$ss" 'BEGIN{OFS=","} NR==1{print $0 ",YYYY,MM,DD,HH,TT,SS"} NR>1{print $0 "," y "," m "," d "," h "," t "," s}' "$file" first_file=0 else # 处理后续文件,跳过原有表头 awk -v y="$yyyy" -v m="$mm" -v d="$dd" -v h="$hh" -v t="$tt" -v s="$ss" 'BEGIN{OFS=","} NR>1{print $0 "," y "," m "," d "," h "," t "," s}' "$file" fi done } > merged_output.csv
命令解释
- 文件名时间提取:通过
sed正则匹配,从文件名中剥离出时间字符串,再用read命令分割为独立的年、月、日、时、分、秒变量 - 表头唯一化处理:仅在第一个文件的表头后追加新的时间列名,后续文件直接跳过原有表头,避免合并后重复出现表头
- 字段追加:利用AWK将提取的时间字段追加到每一行末尾,保持CSV的逗号分隔格式
- 合并输出:将所有处理后的内容统一重定向到
merged_output.csv文件中
示例验证
输入文件示例(ZZ_OUT2023_10_19_12_60_60_csvfile.csv)
ID, Name, OpenPrice, ClosePrice 1, ABC, 555, 560 2, DEF, 666, 670
处理后输出片段(merged_output.csv)
ID, Name, OpenPrice, ClosePrice,YYYY,MM,DD,HH,TT,SS 1, ABC, 555, 560,2023,10,19,12,60,60 2, DEF, 666, 670,2023,10,19,12,60,60
内容的提问来源于stack exchange,提问作者Speak Truth
相关产品推荐
相关产品推荐

