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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:52:33