如何从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
相关产品推荐
相关产品推荐

