Como remover linhas duplicadas que começam com um padrão e a próxima linha depois disso?

3

Eu quero remover as linhas duplicadas que começam com > e a próxima linha depois disso.

Por exemplo:

>1
ACCGGTTTCCTTGAAATT
>2 
AACCTTCCGGTTAATT
>3 
AACCTTCCGGTTAATT
>1 
ACCGGTTTCCTTGAAATT

Como você pode ver, eu tenho as próximas duas linhas duplicadas:

AACCTTCCGGTTAATT and >1 

No entanto, só quero remover >1 e a próxima linha, por isso quero e reproduzo como:

>1
ACCGGTTTCCTTGAAATT
>2
AACCTTCCGGTTAATT
>3
AACCTTCCGGTTAATT

Se eu usar algo como:

awk '!seen[$0]++'  filename

A saída é:

>1
ACCGGTTTCCTTGAAATT
>2
AACCTTCCGGTTAATT
>3

Porque remove todas as linhas duplicadas e eu só quero remover as linhas duplicadas que começam com > e a próxima linha depois disso.

Meu arquivo verdadeiro é de vários milhares de linhas, então eu poderia ter vários nomes após o símbolo > que poderia ser repetido.

Alguma sugestão?

    
por Eric González 23.09.2015 / 19:29

3 respostas

3

Você pode usar getline no seu awk para buscar a próxima linha:

awk '/^>/{ if(!seen[$0]++){ print;getline;print } else { getline } }'

Existe uma resposta mais simples que também lida com várias linhas:

awk '/^>/{ skip = seen[$0]++ }
     { if(!skip)print }'
    
por 23.09.2015 / 20:03
2

Com o POSIX tools chest:

paste - - <file | awk '{$1=$1};!seen[$0]++' | tr '\t' '\n'
    
por 23.09.2015 / 19:39
0

com awk :

awk 'NR%2==1{l=$0;next} !seen[l"\n"$0]++{print l"\n"$0}' file
  • NR%2==1 é verdadeiro a cada segunda linha, portanto, as linhas com >1 , >2 e >3 . Nesse caso, salve esse conteúdo para uma variável l e continue com a linha next .
  • !seen[l"\n"$0]++ aqui não verificamos linhas exclusivas, verificamos 2 linhas consecutivas únicas.
    • Se forem exclusivos, imprima a última linha l e a linha atual $0 com uma nova linha \n entre eles.

A saída:

>1 
ACCGGTTTCCTTGAAATT
>2 
AACCTTCCGGTTAATT
>3 
AACCTTCCGGTTAATT
    
por 23.09.2015 / 19:57