如何在Bash中同时对应处理两组同序号的文件?
解决文件一一配对处理的问题
修复数组索引循环的写法
你原来的数组循环错误在于遍历的是数组长度而非索引,正确写法应该遍历数组的索引:
bam=(*.bam) ids=(*.txt) # C风格循环,遍历索引从0到数组长度-1 for ((i=0; i<${#bam[@]}; i++)); do f=${bam[i]} e=${ids[i]} samtools view -N "$e" "$f" > "${f%.bam}.fasta" done
或者用索引遍历的方式:
bam=(*.bam) ids=(*.txt) for i in "${!bam[@]}"; do f=${bam[i]} e=${ids[i]} samtools view -N "$e" "$f" > "${f%.bam}.fasta" done
注意:要确保*.bam和*.txt的排序一致(比如按文件名数字排序),如果系统默认排序不是数字序,可以用bam=($(ls -v *.bam))和ids=($(ls -v *.txt))强制按版本号排序,避免10.bam排到2.bam前面的问题。
用GNU Parallel实现一一配对
要避免生成笛卡尔积,需使用Parallel的配对模式,有两种方法:
方法1:使用--xapply参数
--xapply会让两个列表的元素一一对应,而非生成所有组合:
parallel --dry-run --xapply 'samtools view -N {1} {2} > {2.}.fasta' ::: *.txt ::: *.bam
方法2:使用:::+分隔符
:::+同样用于配对两个列表的对应元素:
parallel --dry-run 'samtools view -N {1} {2} > {2.}.fasta' ::: *.txt ::::+ *.bam
若需强制数字排序,可写成:
parallel --dry-run --xapply 'samtools view -N {1} {2} > {2.}.fasta' ::: $(ls -v *.txt) ::: $(ls -v *.bam)
内容的提问来源于stack exchange,提问作者pedro
相关产品推荐
相关产品推荐

