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

Run command on pair of files (different file types) with matching character string

我有一个文件列表:

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

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

与bash的Parameter Expansion:

for file in *.fa; do seqkit grep -f "${file%%.*}.id.txt" >"${file%%.*}.output.fa" <"$file" & done
#!/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 的目的是仅挑出具有相应 .ids.txt 文件的以 .fa 结尾的文件。 如果您希望每一对的所有内容都 运行 并行,请在 cat ${f}.fa ... 文件的末尾附加一个 &。 (注意不要生成太多并行任务!)

这将 运行 每个 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 online: https://doi.org/10.5281/zenodo.1146014)。您的命令行会因此爱上您。