Если Вы имеете socat
удобный, существует этот пример в руководстве, которое Вы могли использовать.
(sleep 5; echo PASSWORD; sleep 5; echo ls; sleep 1) |
socat - EXEC:'ssh -l user server',pty,setsid,ctty
EXEC’utes an ssh session to server. Uses a pty for communication
between socat and ssh, makes it ssh’s controlling tty
(ctty), and makes this pty the owner of a new process group
(setsid), so ssh accepts the password from socat.
Простой случай, который вы показываете, тривиален. Ваши последовательности никогда не могут быть больше одной строки, поэтому вы можете просто использовать grep
для поиска каждого из ваших идентификаторов и строки после них:
grep -Fwf list.txt -A 1 seq.fasta | grep -v '^--$' > out.fasta
grep -v '^ - $'
просто отфильтровывает строки с помощью -
, которые grep
добавляет между группами строк вывода при использовании параметра -A
.
Чтобы также избежать дублирования, вы можете передать свой список через (GNU) sort:
grep -Fwf <(sort -u list.txt) -A 1 seq.fasta | grep -v '^--$' > out.fasta
Используемые флаги:
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing. (-f is
specified by POSIX.)
-w, --word-regexp
Select only those lines containing matches that form whole
words. The test is that the matching substring must either be
at the beginning of the line, or preceded by a non-word
constituent character. Similarly, it must be either at the end
of the line or followed by a non-word constituent character.
Word-constituent characters are letters, digits, and the
underscore.
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by
newlines, any of which is to be matched. (-F is specified by
POSIX.)
-A NUM, --after-context=NUM
Print NUM lines of trailing context after matching lines.
Places a line containing a group separator (--) between
contiguous groups of matches. With the -o or --only-matching
option, this has no effect and a warning is given.
Однако в большинстве случаев ваши последовательности будут состоять из нескольких строк, и этого будет недостаточно. Если вы будете делать подобные вещи часто, я предлагаю вам установить набор инструментов exonerate
. Как правило, они чрезвычайно полезны для работы в области биоинформатики и включают в себя прекрасный инструмент под названием fastafetch
, который разработан, чтобы делать именно то, что вы хотите:
Установите пакет exonerate. Он находится в репозиториях систем на основе Debian, а также доступен по ссылке здесь .
sudo apt-get install exonerate
Создайте индекс для вашего файла fasta. Это используется для быстрого поиска последовательностей.
fastaindex seq.fasta seq.idx
Извлеките ваши последовательности:
$ fastafetch -f seq.fasta -i seq.idx -Fq <(sort -u list.txt)
> 3566454__len__1744
GGTTTGTAAGACCGTAGAGGGTTTGTAAGACCGTAGAG
> 58759__len__2903
TTTTCCGTAGAGGAGATCCCTATTTTTAGGTTTGTAAGAGATCATTTT
> 673957__len__1655
CCCTATTTTTAGGTTTGTAAGGTTTGTAAGACCGTAGAG
В качестве примечания, я написал сценарий, который может делать это и многое другое. Он может принимать один или несколько списков входных идентификаторов и извлекать соответствующие последовательности из мультифаста. Он может либо печатать в STDOUT, либо создавать файл для каждого входного списка. Вы можете найти его здесь .