提问人:tbiewerh 提问时间:9/18/2023 更新时间:9/21/2023 访问量:45
如何遍历具有不同物种名称和不同样本大小的 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
问:
我想通过这个命令传递来自几个不同物种的样本:
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
感谢您抽出宝贵时间接受采访。
答:
1赞
Ed Morton
9/19/2023
#1
猜测,因为我不知道文件是什么,也不知道它与您的文件有关,也不知道,这可能是您要做的:bam
species
bcftools
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' *_*.bam
printf '%s\n' *_*.bam | cut -d'_' -f1
cut
man 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 的情况下命令将执行的操作。如果您对此感到满意,请删除“回声”
- 列出所有 .bam 文件
- 从列表中的文件名中删除 _* 后缀
- 对前缀(物种)进行排序,仅打印出唯一值
- 对于每个唯一值,获取具有该前缀的所有文件的列表,并将其传递给 bcftools...命令作为单独的参数。
评论