Bash脚本遍历含数字命名文件目录,处理成对文件的方法
Bash脚本处理成对fq.gz文件的解决方案
先解决变量拼接的语法问题
你写的P$i_1.fq.gz会被Bash错误解析:它会把$i_1当成一个完整的变量名,而不是$i加上_1。正确的写法是用**大括号{}**包裹变量名,明确分隔变量和后续字符,即P${i}_1.fq.gz。
方法1:硬编码数字范围循环(适合已知固定编号的场景)
如果确定文件编号是1到10,可以直接循环数字,每次生成一对文件路径:
for i in {1..10}; do # 定义成对的两个文件路径 read1="P${i}_1.fq.gz" read2="P${i}_2.fq.gz" # 这里替换为你的实际处理逻辑,比如质控、比对等 echo "正在处理:$read1 和 $read2" # 示例操作:用fastqc做质控 # fastqc "$read1" "$read2" -o ./qc_output/ done
方法2:自动识别目录内的所有成对文件(更灵活健壮)
如果文件编号不连续,或者不想硬编码范围,可以自动遍历目录里的所有P*_1.fq.gz文件,再推导对应的配对文件:
# 遍历所有前缀为P*的_1.fq.gz文件 for read1 in P*_1.fq.gz; do # 从read1文件名中提取前缀(比如把P1_1.fq.gz变成P1) prefix="${read1%_1.fq.gz}" # 生成对应的配对文件路径 read2="${prefix}_2.fq.gz" # 先检查配对文件是否存在,避免报错 if [ -f "$read2" ]; then echo "正在处理:$read1 和 $read2" # 这里写你的实际处理命令 else echo "警告:$read1 的配对文件 $read2 不存在,跳过" fi done
这种方法不需要提前知道编号范围,还能自动跳过缺失配对的文件,容错性更强。
内容的提问来源于stack exchange,提问作者DYLAN NICO AMBROSI
相关产品推荐
相关产品推荐

