如何在Bash中遍历目录文件及行,提取CSV指定列与文件名日期?
Bash脚本修正方案:提取CSV列并合并日期
原脚本存在的问题
- 日期提取正则不匹配:文件名中的日期格式是
YYYY_MM_DD(下划线分隔),但原脚本使用了匹配横杠分隔日期的正则,导致无法正确提取日期。 - Awk变量传递错误:原脚本中Awk代码未接收Shell的
TargetColumn变量,导致$TargetColumn无法解析为目标列号,最终输出整行内容。 - 未跳过表头行:提取列值时包含了表头,需要从第二行开始读取数据行。
- 输出格式错误:直接用
echo输出多行变量时,会把换行符替换为空格,导致所有列值挤在同一行,无法正确追加到目标文件。
修正后的完整脚本
#!/bin/bash # 目标文件路径,可提前清空原有内容 target_file="TargetFile.csv" # 可选:如果需要覆盖历史数据,取消下面的注释 # > "$target_file" for filename in /mnt/c/temp/*.csv; do # 1. 提取文件名中的日期(处理下划线分隔格式) VarDate=$(basename "$filename" .csv | grep -Eo '[[:digit:]]{4}_[[:digit:]]{2}_[[:digit:]]{2}') # 可选:如需将日期格式转为横杠分隔,取消下面的注释 # VarDate=$(echo "$VarDate" | sed 's/_/-/g') # 2. 获取employeeID列的列号(兼容带引号的表头) TargetColumn=$(awk -F ',' -v col='"employeeID"' 'NR==1{for(i=1;i<=NF;i++) if($i==col){print i;exit}}' "$filename") # 3. 提取数据行的目标列值,每行追加日期后写入目标文件 awk -F ',' -v date="$VarDate" -v col="$TargetColumn" 'NR>1{print date "," $col}' "$filename" >> "$target_file" done
关键修正说明
- 日期提取优化:用
basename "$filename" .csv直接去除文件后缀,配合匹配下划线日期的正则,确保正确提取日期字符串。 - Awk变量传递:通过
-v参数将Shell变量传递给Awk,保证目标列号能被正确识别。 - 表头过滤:用
NR>1跳过第一行表头,只处理有效数据行。 - 直接写入文件:让Awk直接处理每行数据并生成目标格式,避免Shell变量存储多行内容导致的格式混乱。
内容的提问来源于stack exchange,提问作者SomekindaRazzmatazz
相关产品推荐
相关产品推荐

