С
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'
достаточно.
Подводя итог, приведенная выше команда сохраняет только первое число в вашей строке ввода.
Я думаю, что хорошим способом для параллельных команд мог бы быть... 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
Вы можете сгруппировать команды для запуска в фоновом режиме
не проверено
#!/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