如何遍历具有不同物种名称和不同样本大小的 bam 文件,然后将它们传递给同一命令?- 抨击

How do I loop through bam files with different species designations and different sample sizes, and then pass them to the same command? - Bash

提问人:tbiewerh 提问时间:9/18/2023 更新时间:9/21/2023 访问量:45

问:

我想通过这个命令传递来自几个不同物种的样本:

bcftools mpileup -Ob -o <study.bcf> -f <ref.fa> <sample1.bam> <sample2.bam> <sample3.bam>

考虑到每个物种可能有 3-5 个不同的个体,我怎么能通过循环做到这一点?这些文件如下所示,物种在前,个体在后:

107_2.bam  107_7.bam    1322_7.bam  1589_3.bam  1777_8.bam  1782_3.bam  2172_5.bam  716_11.bam  716_7.bam   M82_3.bam
107_4.bam  1322_10.bam  1322_9.bam  1589_5.bam  1777_9.bam  1782_5.bam  2172_7.bam  716_5.bam   716_9.bam   M82_4.bam
107_6.bam  1322_1.bam   1589_2.bam  1777_4.bam  1782_2.bam  2172_3.bam  2172_9.bam  716_6.bam   M82_11.bam  M82_8.bam

感谢您抽出宝贵时间接受采访。

bash 循环 bcftools

评论


答:

1赞 Ed Morton 9/19/2023 #1

猜测,因为我不知道文件是什么,也不知道它与您的文件有关,也不知道,这可能是您要做的:bamspeciesbcftools

while IFS= read -r species; do
    bcftools mpileup -Ob -o <study.bcf> -f <ref.fa> "${species}_"*.bam
done < <(printf '%s\n' *_*.bam | cut -d'_' -f1 | sort -u)

上面假设您的文件名不包含换行符,并且“物种”不能包含下划线,如您提供的示例所示。

评论

0赞 tbiewerh 9/19/2023
谢谢埃德。我将测试一下,但是由于我是 bash 的新手,因此我不明白一些事情。这条线在做什么?< <(printf '%s\n' *_*.bam | cut -d'_' -f1 | sort -u)
0赞 Ed Morton 9/19/2023
@tbiewerh 以增量方式运行命令以查看它们的作用。跑去看看它有什么作用。然后运行以查看添加做了什么,依此类推。这些工具中的每一个都有手册页(例如)。 是一种 bash-ism,意思是“使用此命令的输出作为输入”,在这种情况下,它是读取该输入的循环。printf '%s\n' *_*.bamprintf '%s\n' *_*.bam | cut -d'_' -f1cutman cut< <(command)while ... done
0赞 tecnico 9/20/2023 #2

假设您想在单个命令上对具有相同前缀(物种)的文件进行分组:

while read species; do echo bcftools mpileup -Ob -o <study.bcf> -f <ref.fa> $(ls ${species}*) ; done < <(ls -1 *bam |sed -e 's/_.*//g'|sort -u)

上面一行中的“echo”可帮助您了解在不执行 bcftools cmd 的情况下命令将执行的操作。如果您对此感到满意,请删除“回声”

  1. 列出所有 .bam 文件
  2. 从列表中的文件名中删除 _* 后缀
  3. 对前缀(物种)进行排序,仅打印出唯一值
  4. 对于每个唯一值,获取具有该前缀的所有文件的列表,并将其传递给 bcftools...命令作为单独的参数。