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

如何从CSV文件解析特定值并传入shell for循环的执行命令中

解决方案

方案1:直接遍历CSV行执行(适合CSV样本和目录完全匹配的场景)

这种方式逻辑最简单,无需额外存储映射关系,直接按CSV里的样本逐个处理:

#!/bin/bash
# 提前创建结果目录避免报错
mkdir -p results
# 逐行读取CSV,逗号分隔分别赋值给样本编号和平均读长变量
while IFS=, read -r sample_no avg_read_length || [ -n "$sample_no" ]
do
    shortbred_quantify.py \
        --genome "${sample_no}/sample${sample_no}_genome.fasta" \
        --average_read_length "${avg_read_length}" \
        --results "results/quantify_results_sample${sample_no}"
# 替换为你的CSV文件路径
done < sample_read_length.csv

如果你的CSV包含表头行(第一行是sample_no,avg_read_length),把最后一行改为下面的内容跳过表头即可:

done < <(tail -n +2 sample_read_length.csv)

方案2:先存映射关系再遍历目录(适合仅需处理存在的目录的场景)

如果存在CSV里有记录但对应目录不存在的情况,用这种方法可以只处理实际存在的样本目录:

#!/bin/bash
mkdir -p results
# 声明关联数组存储样本编号和读长的映射关系
declare -A read_length_map
# 读取CSV写入关联数组
while IFS=, read -r sample_no avg_read_length || [ -n "$sample_no" ]
do
    read_length_map["$sample_no"]="$avg_read_length"
done < sample_read_length.csv
# 遍历当前目录下所有子目录
for dir in */
do
    # 提取目录名(去掉末尾的/)作为样本编号
    sample_no=${dir%/}
    # 仅当该样本在CSV中有对应读长时才执行命令
    if [[ -n "${read_length_map[$sample_no]}" ]]; then
        shortbred_quantify.py \
            --genome "${sample_no}/sample${sample_no}_genome.fasta" \
            --average_read_length "${read_length_map[$sample_no]}" \
            --results "results/quantify_results_sample${sample_no}"
    fi
done

注意事项

  • 已修正你原始代码中的两处笔误:参数名--aerage_read_length改为正确拼写--average_read_length,基因组文件名补全了_genome后缀,匹配你给出的文件命名规则
  • 所有变量都添加了双引号包裹,避免特殊字符或空格导致的语法错误
  • 脚本中|| [ -n "$sample_no" ]的作用是兼容CSV末尾没有换行符的情况,避免漏掉最后一行数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:45:05