You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

关键修正说明

  1. 日期提取优化:用basename "$filename" .csv直接去除文件后缀,配合匹配下划线日期的正则,确保正确提取日期字符串。
  2. Awk变量传递:通过-v参数将Shell变量传递给Awk,保证目标列号能被正确识别。
  3. 表头过滤:用NR>1跳过第一行表头,只处理有效数据行。
  4. 直接写入文件:让Awk直接处理每行数据并生成目标格式,避免Shell变量存储多行内容导致的格式混乱。

内容的提问来源于stack exchange,提问作者SomekindaRazzmatazz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 08:42:36