在具有匹配字符串的文件对(不同文件类型)上运行命令

时间:2019-01-05 07:17:59

标签: bash cat seq gnu-parallel

我有一个文件列表:

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

如何为目录中的每个文件对并行运行此命令?感谢您的帮助!

3 个答案:

答案 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%.*}"提取不带扩展名的文件名,有关说明,请参见hereif的目的是仅挑选出以.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)。您的命令行会为此而爱您。