Redirecionando seds para arquivos individuais

0

Eu tenho um arquivo contendo uma lista de nomes de seqüência de DNA e outro contendo seqüências de DNA. Eles se parecem com isso:

$ cat list.txt
seq1
seq3

$ cat sequences.txt
>seq1
AAAAA
AAAAA
>seq2
CCCCC
CCCCC
CCCCC
>seq3
TTTTT

Eu quero recuperar apenas seq1 e seq2 (listados em list.txt) e redirecioná-los para arquivos individuais. Como você pode ver, cada seqüência tem um número diferente de linhas, portanto, não posso simplesmente dizer para 'sed' pegar N número de linhas após cada partida. Eu quero minha saída assim:

$ ls
seq1.txt
seq2.txt

$ cat seq1.txt
>seq1
AAAAA
AAAAA
$ cat seq2.txt
>seq3
TTTTT

Estou usando isso:

while read list
do
names=$(echo $list)
        sed '/$list/,/>/{/>/q}' "$PWD/sequences.txt" > "$names".dna
done < list.txt

No entanto, a saída é:

$ ls
seq1.txt
seq2.txt

$ cat seq1.txt
>seq1
AAAAA
AAAAA
>seq3
TTTTT

$ cat seq2.txt
>seq1
AAAAA
AAAAA
>seq3
TTTTT

O script está criando arquivos individuais, mas todos contêm todas as correspondências, não os indivíduos, conforme necessário.

Obrigado antecipadamente.

    
por Carlos Riera-Ruiz 08.06.2018 / 20:17

2 respostas

0

Não é possível fazer isso com sed sozinho. Mas com o awk:

awk '
    # remember the wanted sequences
    NR == FNR {seqs[$1]; next}

    $1 ~ /^>/ {
        # get the sequence name
        seq = $1
        sub(/^>/, "", seq)
        p = 0
        # if it is in the list, set up the file to print to
        if (seq in seqs) {
            f = seq ".txt"
            p = 1
        }
    }
    p {print > f}
' list.txt sequences.txt 
    
por 08.06.2018 / 20:51
0
command

awk '$1 ~ /seq1/{f=1}$1~/seq2/{f=0;exit}f' sequences.txt  >seq1.txt

sed -n '/seq3/,$p' sequences.txt > seq2.txt

saída

cat seq1.txt
seq1
AAAAA
AAAAA

cat seq2.txt
seq3
TTTTT
    
por 10.06.2018 / 13:05