Removendo uma linha vazia e a linha acima dela

2

Eu tenho um grande arquivo .fna contendo milhões de seqüências de DNA. Devido a alguns erros de gravação após o truncamento de meus primers, fico com alguns cabeçalhos de seqüência sem sequência seguindo-o. Um exemplo é mostrado abaixo. Preciso excluir esses cabeçalhos, bem como as linhas vazias, para continuar com meus scripts de fluxo de trabalho.

B2S312_20116609 HWI-ST1128:217:D2HB4ACXX:8:1101:20814:45721 orig_bc=CCGCATAA new_bc=CCGCATAA bc_diffs=0
AACCATGCACCACCTGTATCTGTGTCTAACCAAAGGTCAGAACAACACAATCTCTTGTGTCCTCACAGTATGTCAAGACTT

B4S315_20116610 HWI-ST1128:217:D2HB4ACXX:8:1101:20948:45746 orig_bc=ATATGCCG new_bc=ATATGCCG bc_diffs=0
AACCATGCACCACCTGCACACGACCAACTAAATGCCACCACATCTCTGCAGTGTCGCCGTGCATGTCAAGCCTT

A3C214_20116611 HWI-ST1128:217:D2HB4ACXX:8:1101:20874:45747 orig_bc=GATCCAAC new_bc=GATCCAAC bc_diffs=0

A2C214_20116612 HWI-ST1128:217:D2HB4ACXX:8:1101:21248:45534 orig_bc=CCTAGGAT new_bc=CCTAGGAT bc_diffs=0
AACCGTGCACCACCTGTTTTCTGGCTTCCGAAGAAGAGGAACTATCTCTAGTTCTGTCCATCAATGTCAAGACCT

Portanto, neste exemplo, eu gostaria de remover a linha A3C214_20116611 HWI-ST1128:217:D2HB4ACXX:8:1101:20874:45747 orig_bc=GATCCAAC new_bc=GATCCAAC bc_diffs=0 e a linha vazia abaixo dela.

Consegui excluir apenas a linha vazia usando sed, mas não consigo encontrar um exemplo adequado para o meu cenário.

    
por Ting 26.01.2015 / 08:53

4 respostas

2

sed '$!N;/:.*\n$/d;P;D' <infile

O comando acima extrai a linha N ext em cada linha que é ! e não a $ anterior. Se encontrar um espaço de padrão no qual um : dois pontos é encontrado e o último caractere for um \n ewline, ele excluirá o lote. Isso significa que, para linhas que contêm dois pontos e a linha a seguir está em branco, ambas serão excluídas. Para todos os outros, P corresponde ao primeiro ewline \n no espaço padrão e, em seguida, D elimina o mesmo antes de recomeçar com o que resta. Isso lhe dá uma olhada de uma linha em todo o arquivo.

    
por 26.01.2015 / 14:42
0

(Para as soluções abaixo, eu suponho que você queria uma linha em branco para preceder cada cabeçalho + linha de seqüência. Se você quiser depois, me avise, que é uma mudança fácil de fazer.)

Usando sed

$ sed -rn 's/(.{106})/\n/p' file

B2S312_20116609 HWI-ST1128:217:D2HB4ACXX:8:1101:20814:45721 orig_bc=CCGCATAA new_bc=CCGCATAA bc_diffs=0 AACCATGCACCACCTGTATCTGTGTCTAACCAAAGGTCAGAACAACACAATCTCTTGTGTCCTCACAGTATGTCAAGACTT

B4S315_20116610 HWI-ST1128:217:D2HB4ACXX:8:1101:20948:45746 orig_bc=ATATGCCG new_bc=ATATGCCG bc_diffs=0 AACCATGCACCACCTGCACACGACCAACTAAATGCCACCACATCTCTGCAGTGTCGCCGTGCATGTCAAGCCTT

A2C214_20116612 HWI-ST1128:217:D2HB4ACXX:8:1101:21248:45534 orig_bc=CCTAGGAT new_bc=CCTAGGAT bc_diffs=0 AACCGTGCACCACCTGTTTTCTGGCTTCCGAAGAAGAGGAACTATCTCTAGTTCTGTCCATCAATGTCAAGACCT

Como funciona

  • -r

    -r diz a sed para usar expressões regulares estendidas.

  • -n

    -n indica sed para não imprimir nenhuma linha, a menos que explicitamente solicitado.

  • s/(.{106})/\n/p

    Se qualquer linha tiver pelo menos 106 caracteres, adicionamos uma nova linha ao início e a imprimimos.

    Como as linhas em branco não possuem 106 caracteres, elas não são impressas.

    Como as linhas sem sequências de DNA são menores que 106 caracteres, elas não são impressas.

    Linhas com sequências de DNA (fazendo-as com 106 caracteres ou mais) são impressas. Como as linhas em branco por si só não são impressas, temos que adicionar uma nova linha ao início da linha. Assim, garante que cada registro de DNA é precedido por uma linha em branco.

Não-GNU sed

Se estiver usando o OSX (BSD), tente:

sed -E -n -e 's/(.{106})/\n/p' file

Usando awk

awk '$6 {print "\n"$0}' file

A sequência de DNA é o sexto campo na linha. Assim, para qualquer linha com um sexto campo não vazio, imprimimos essa linha precedida por uma nova linha.

    
por 26.01.2015 / 09:48
0

Só quero mencionar que você poderia fazer isso usando vi :

:g/PATTERN/normal 2dd

Onde PATTERN é o que você está procurando. Isso corresponderá a PATTERN e executará 2dd (excluir linha - 2 vezes) no modo normal .

    
por 26.01.2015 / 10:38
0

Usando Ex / vi

Fazendo um comando da sugestão @ReulSharabin:

ex -s +'g/bc_diffs=0$/d +2' +x   file

que é semelhante a:

vim +':g/bc_diffs=0$/d +2' +:x   file

(+ comando = executar comando; +x = salvar e sair)

Ok, ok, é uma má ideia: não devemos carregar na memória um arquivo tão grande

    
por 26.01.2015 / 13:46