Comment supprimer les lignes en double qui commencent par un motif et la ligne suivante après cela?

Je veux supprimer les lignes en double qui commencent par > et la ligne suivante après cela.

Par exemple:

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

Comme vous pouvez le voir, j'ai les deux lignes dupliquées suivantes:

 AACCTTCCGGTTAATT and >1 

Cependant, je veux seulement supprimer >1 et la ligne suivante, donc je veux et sortir comme:

 >1 ACCGGTTTCCTTGAAATT >2 AACCTTCCGGTTAATT >3 AACCTTCCGGTTAATT 

Si j'utilise quelque chose comme:

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

La sortie est:

 >1 ACCGGTTTCCTTGAAATT >2 AACCTTCCGGTTAATT >3 

Parce qu'il supprime toutes les lignes dupliquées et je veux seulement supprimer les lignes dupliquées qui commencent par > et la ligne suivante après cela.

Mon vrai file est de plusieurs milliers de lignes, donc je pourrais avoir plusieurs noms après le symbole > qui pourraient être répétés.

Aucune suggestion?

Vous pouvez utiliser getline dans votre awk pour aller chercher la ligne suivante:

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

Il y a une réponse plus simple qui gère également plusieurs lignes:

 awk '/^>/{ skip = seen[$0]++ } { if(!skip)print }' 

Avec le coffre à outils POSIX:

 paste - - <file | awk '{$1=$1};!seen[$0]++' | tr '\t' '\n' 

Avec awk :

 awk 'NR%2==1{l=$0;next} !seen[l"\n"$0]++{print l"\n"$0}' file 
  • NR%2==1 est vrai toutes les 2 lignes, donc les lignes avec >1 , >2 et >3 . Dans ce cas, sauvegardez ce contenu dans une variable l et continuez avec la ligne next .
  • !seen[l"\n"$0]++ ici nous ne vérifions pas les lignes uniques, nous vérifions 2 lignes consécutives uniques.
    • S'ils sont uniques, imprimez la dernière ligne l et la ligne courante $0 avec une nouvelle ligne \n entre eux.

Le résultat:

 >1 ACCGGTTTCCTTGAAATT >2 AACCTTCCGGTTAATT >3 AACCTTCCGGTTAATT