Remova ambas as linhas se os valores da coluna A forem repetidos na próxima linha

1

Minha entrada é assim:

pak_c35079_g1_i1|m.14890    Pfam  
pak_c20797_g1_i1|m.3458     ProDom  
pak_c20797_g1_i1|m.3458     Pfam  
pak_c28265_g1_i3|m.9595     TIGRFAM  
pak_c28265_g1_i3|m.9595     Pfam  
.  
.  
.  

Eu quero uma saída como esta:

pak_c35079_g1_i1|m.14890    Pfam
pak_c28265_g1_i3|m.9595     TIGRFAM
pak_c28265_g1_i3|m.9595     Pfam   

Significa que se um valor é repetido na próxima linha (na coluna A), então apague ambas as linhas.

    
por Waqasuddin Khan 20.12.2015 / 19:41

2 respostas

1

Você pode fazer isso com awk :

awk 'BEGIN {last=""; last_line=""} { if (last == $1) {} else {print last_line} last=$1; last_line = $0}' < file_to_proceed

Eu não sou um especialista em awk , você terá problemas com a última linha ...

    
por 20.12.2015 / 20:12
0
sed '$!N;/^\([^ ]* \).*\n/d;P;D' <in >out

Ele não irá lidar com três primeiros campos idênticos consecutivos - mas isso não parece ser o que você pergunta, de qualquer forma.

Minha saída é um pouco diferente da saída do seu exemplo, dada sua entrada de exemplo:

pak_c35079_g1_i1|m.14890    Pfam  

O comando sed acima não imprime as duas linhas:

pak_c28265_g1_i3|m.9595     TIGRFAM
pak_c28265_g1_i3|m.9595     Pfam   

... porque isso parece entrar em conflito com a coisa que você pede, e por isso só posso imaginar que ela seja incluída em sua saída de exemplo.

    
por 20.12.2015 / 21:00