Читайте строки файла и выполняйте веб-операции и сохраняйте вывод как отдельные файлы, используя терминал - PullRequest
1 голос
/ 13 апреля 2019

Мне нужно прочитать строки в input.txt и проигнорировать строки, начинающиеся с '>', прочитать следующую строку и использовать веб-инструмент для получения вывода в формате fastta.Я написал код, но не могу игнорировать строки «>» на данный момент и хочу изменить имена строк более простым способом, например, в приведенном примере (output_1.fasta)

 $i = 0 ; 
while read line:
if line: do curl -s -d "dna_sequence="$line"&output_format=fasta" https://web.expasy.org/cgi-bin/translate/dna2aa.cgi >> my_${line}.fasta; $i+1; done < 'input.txt'

input.txt
>A123
ATTGGGCCTTTT
>B1234
GGGCCCTTAAA

output_1.fasta
>A123
#entire output from the web server
GHHGGGSSSAAA

output_2.fasta
>B1234
HHJJKKLLLL

Ответы [ 3 ]

1 голос
/ 13 апреля 2019

Bash решение:

#!/bin/env bash
i=0
while IFS=  read -r -d $'\n'
do
  ((i++))
  curl -s -d "dna_sequence=${REPLY}&output_format=fasta" 'https://web.expasy.org/cgi-bin/translate/dna2aa.cgi' > "./output_${i}.fasta"
done < <( sed '/^>/d' "./input.txt" )
exit 0

Тест:

$ cat ./input.txt
>A123
ATTGGGCCTTTT
>B1234
GGGCCCTTAAA
$ i=0
$ while IFS=  read -r -d $'\n'
> do
>   ((i++))
>   curl -s -d "dna_sequence=${REPLY}&output_format=fasta" 'https://web.expasy.org/cgi-bin/translate/dna2aa.cgi' > "./output_${i}.fasta"
> done < <( sed '/^>/d' "./input.txt" )
$ ls -1 ./output_*
./output_1.fasta
./output_2.fasta
$ cat ./output_1.fasta
> VIRT-65321:3'5' Frame 1
KRPN
> VIRT-65321:3'5' Frame 2
KGP
> VIRT-65321:3'5' Frame 3
KAQ
> VIRT-65321:5'3' Frame 1
IGPF
> VIRT-65321:5'3' Frame 2
LGL
> VIRT-65321:5'3' Frame 3
WAF
$ cat ./output_2.fasta
> VIRT-65327:3'5' Frame 1
FKG
> VIRT-65327:3'5' Frame 2
LRA
> VIRT-65327:3'5' Frame 3
-GP
> VIRT-65327:5'3' Frame 1
GPL
> VIRT-65327:5'3' Frame 2
GP-
> VIRT-65327:5'3' Frame 3
ALK
0 голосов
/ 13 апреля 2019
$ cat tst.sh
#!/bin/env bash

i=0
while IFS= read -r line; do
    if [[ $line =~ ^\> ]]; then
        outfile="output_((++i)).fasta"
        printf '%s\n' "$line" > "$outfile"
    else
        curl -s -d 'dna_sequence="'"$line"'"&output_format=fasta' 'https://web.expasy.org/cgi-bin/translate/dna2aa.cgi' >> "$outfile"
    fi
done < input.txt

.

$ ./tst.sh

.

$ cat output_1.fasta
>A123
> VIRT-92094:3'5' Frame 1
KRPN
> VIRT-92094:3'5' Frame 2
KGP
> VIRT-92094:3'5' Frame 3
KAQ
> VIRT-92094:5'3' Frame 1
IGPF
> VIRT-92094:5'3' Frame 2
LGL
> VIRT-92094:5'3' Frame 3
WAF

.

$ cat output_2.fasta
>B1234
> VIRT-92247:3'5' Frame 1
FKG
> VIRT-92247:3'5' Frame 2
LRA
> VIRT-92247:3'5' Frame 3
-GP
> VIRT-92247:5'3' Frame 1
GPL
> VIRT-92247:5'3' Frame 2
GP-
> VIRT-92247:5'3' Frame 3
ALK
0 голосов
/ 13 апреля 2019

вы сейчас приближаетесь к уровню сложности, когда использование bash больше не имеет смысла, и вам следует подумать о портировании его на более подходящий язык сценариев, imo ... также вы не правильно выходите из строки $, что произойдет, если$ line содержит &foo=bar?curl не будет интерпретировать его как часть dna_sequence, curl подумает, что это совершенно новая переменная с именем foo, содержащая bar .. вот порт для PHP :

#!/usr/bin/env php
<?php
$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL => 'https://web.expasy.org/cgi-bin/translate/dna2aa.cgi',
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_ENCODING => ''
));
foreach (file('input.txt', FILE_SKIP_EMPTY_LINES) as $line) {
    $line = trim($line);
    if (!strlen($line) || $line[0] === '>') {
        continue;
    }
    curl_setopt_array($ch, array(
        CURLOPT_POST => 1,
        CURLOPT_POSTFIELDS => http_build_query(array(
            'dna_sequence' => $line,
            'output_format' => 'fasta'
        ))
    ));
    file_put_contents("my_{$line}.fasta", curl_exec($ch));
}
curl_close($ch);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...