Как запустить сценарий bash, используя потоки/параллельный интерфейс

С

sed -r 's/([^0-9]*)([0-9]*)([^0-9]*)/\2/g'

вы можете оставить только число в середине. Это работает только с расширенными регулярными выражениями, поэтому вам нужна опция -rдля sed.

На самом деле достаточно использовать

sed -r 's/([^0-9]*)([0-9]*)(.*)/\2/g'

Здесь используется функция ссылки на части выражения с помощью \1, \2,... Затем вам нужно использовать круглые скобки (...)вокруг той части выражения, на которую вы хотите сослаться. В приведенном выше коде вторая часть ([0-9]*)будет соответствовать числу в середине, и вы можете сослаться на это как \2.

Редактировать:Как указал terdon, нам не нужно захватывать начальную часть, так как мы ее больше не используем. Так

sed -n -r 's/[^0-9]*([0-9]+).*/\1/p'

достаточно.

Подводя итог, приведенная выше команда сохраняет только первое число в вашей строке ввода.

1
18.03.2021, 16:51
2 ответа

Я думаю, что хорошим способом для параллельных команд мог бы быть... GNUparallel. Определите свой блок как функцию, как предложил glenn jackmann , а затем запустите их с параллельным выполнением, где -jпозволяет определить максимальное количество параллельных прогонов. Преимущество по сравнению с подходом Гленна заключается в том, что если какой-либо блок будет выполнен, будет запущен новый, поэтому у вас всегда будет 10 запущенных одновременно. Обратите внимание, что вам придется экспортировать функцию для параллельного просмотра, чтобы увидеть ее.

#!/bin/bash
g++ -std=c++11 shrink_files.cpp -o _shrink

block() {
  prefetch "$1"
  fastq-dump --fasta 0 "$1"
 ...
}

export -f block

parallel -j 10 block ::: id1 id2 id3 id4....

Замените idiвашими идентификаторами. В качестве альтернативы, если у вас есть идентификаторы (SRR837459 и т. д. )в файле, например

id1
id2
id3

тогда используйте вместо этого эту строку (GNU Parallel читает из стандартного ввода, если нет другого источника ввода):

parallel -j 10 block

и запустите скрипт через

bash script < idlist.txt
3
18.03.2021, 20:36

Вы можете сгруппировать команды для запуска в фоновом режиме

не проверено

#!/bin/bash
g++ -std=c++11 shrink_files.cpp -o _shrink

block() {
    local id=$1
    prefetch "$id"
    fastq-dump --fasta 0 "$id"
    rm../../sra_sequences/sra/"$id".sra
   ./_shrink "$id"
    rm "$id".fasta
    echo "$id" >> list_of_done.txt
}

# run first 10 blocks in the background
block SRR837459 &
block SRR805782 &
...
block 10th_id &

# and wait for them to complete
wait

# now start up on the next 10...
block 11th_id &
...

Или следующее немного более программно:

# all the ids to fetch
ids=( SRR837459 SRR805782... )

while (( ${#ids[@]} > 0 )); do
    # copy the first 10 as positional parameters
    set -- "${ids[@]:0:10}"
    # launch the blocks
    for id; do
        block "$id" &
    done
    # wait until done
    wait
    # remove the first 10 from the list
    ids=( "${ids[@]:10}" )
done
2
18.03.2021, 22:24

Теги

Похожие вопросы