我有一个文件列表:
catfish.fa
polar.fa
catfish.ids.txt
polar.ids.txt
我想为每个带有匹配字符串的文件运行此命令。因此,例如,我想运行以下命令:
cat catfish.fa | seqkit grep -f catfish.ids.txt > catfish.output.fa
类似地...
cat polar.fa | seqkit grep -f polar.ids.txt > polar.output.fa
如何为目录中的每个文件对并行运行此命令?感谢您的帮助!
答案 0 :(得分:2)
#!/bin/bash
for f in *.fa
do
filename="${f%.*}"
if [ -e ${f}.ids.txt ]
then
cat ${f}.fa | seqkit grep -f ${f}.ids.txt >${f}.output.fa
fi
done
filename="${f%.*}"
提取不带扩展名的文件名,有关说明,请参见here。
if
的目的是仅挑选出以.fa
结尾的文件,这些文件具有相应的.ids.txt
文件。
如果希望所有内容在每对上并行运行,请在&
文件末尾附加一个cat ${f}.fa ...
。 (请注意不要生成太多并行任务!)
答案 1 :(得分:1)
使用bash的Parameter Expansion:
for file in *.fa; do seqkit grep -f "${file%%.*}.id.txt" >"${file%%.*}.output.fa" <"$file" & done
答案 2 :(得分:1)
这将使每个CPU内核并行运行一个作业:
parallel 'cat {} | seqkit grep -f {.}.ids.txt > {.}.output.fa' ::: *fa
我可以建议您先使用--dry-run
来运行,以便可以看到要运行的内容吗。
parallel --dry-run 'cat {} | seqkit grep -f {.}.ids.txt > {.}.output.fa' ::: *fa
还可以考虑花20分钟阅读《 GNU Parallel 2018》一书的第1 + 2章(印刷版:http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html,在线版:https://doi.org/10.5281/zenodo.1146014)。您的命令行会为此而爱您。