Запустите команду для пары файлов (разных типов файлов) с соответствующей строкой символов - PullRequest
0 голосов
/ 05 января 2019

У меня есть список файлов:

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 голосов
/ 05 января 2019
#!/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%.*}" извлекает имя файла без расширения, см. здесь для объяснения. Цель if состоит в том, чтобы выделить только файлы, заканчивающиеся .fa, которые имеют соответствующий .ids.txt файл. Если вы хотите, чтобы все выполнялось параллельно для каждой пары, добавьте & в конец файла cat ${f}.fa .... (Остерегайтесь не создавать слишком много параллельных задач!)

0 голосов
/ 05 января 2019

Параллельно будет выполняться одно задание на ядро ​​ЦП:

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 минут на чтение главы 1 + 2 книги GNU Parallel 2018 (печать: http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html онлайн: https://doi.org/10.5281/zenodo.1146014). Ваша командная строка полюбит вас за это.

0 голосов
/ 05 января 2019

С bash's Расширение параметра :

for file in *.fa; do seqkit grep -f "${file%%.*}.id.txt" >"${file%%.*}.output.fa" <"$file" & done
...