如何用Shell脚本根据CSV文件内指定列名批量重命名文件
批量重命名CSV文件(按Customer_Name列值)
针对/path/RAS目录下的所有CSV文件,我们可以用awk结合Shell循环实现按列名匹配的批量重命名,解决列位置变化导致的适配问题,具体方案如下:
核心逻辑
- 解析CSV表头,定位
Customer_Name列的索引位置 - 读取文件第一条数据行,提取对应列的值作为新文件名
- 执行重命名操作,避免误覆盖已存在文件
完整执行命令
在终端中运行以下代码:
cd /path/RAS || exit for csv_file in *.csv; do # 跳过空文件 [ -s "$csv_file" ] || continue # 提取Customer_Name列对应的值作为新文件名 new_name=$(awk -F, ' NR==1 { # 遍历表头,找到Customer_Name的列索引 for(i=1; i<=NF; i++) { if($i == "Customer_Name") { col=i; break } } } NR==2 { # 输出目标文件名后退出awk,避免读取多余行 print $col ".csv" exit } ' "$csv_file") # 执行重命名(-n参数防止覆盖已有文件,需强制覆盖可改为-f) [ -n "$new_name" ] && mv -n "$csv_file" "$new_name" done
关键细节说明
NR==1:处理表头行,循环匹配Customer_Name列并记录其索引NR==2:仅读取第一条数据行,提取目标列值生成新文件名后立即退出awk,提升效率mv -n:安全重命名模式,若目标文件已存在则跳过,避免数据丢失[ -s "$csv_file" ]:过滤空文件,防止无数据文件导致的错误
单文件测试(可选)
若要先验证单个文件的输出结果,可执行:
awk -F, ' NR==1 { for(i=1; i<=NF; i++) { if($i == "Customer_Name") { col=i; break } } } NR==2 { print $col ".csv" exit } ' 测试文件.csv
确认输出文件名符合预期后,再执行批量重命名命令。
内容的提问来源于stack exchange,提问作者Loganayaki mahalingam
相关产品推荐
相关产品推荐

