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 ...
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.
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.
Tags text-processing awk sed shell scripting