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.
l
et la ligne courante $0
avec une nouvelle ligne \n
entre eux. Le résultat:
>1 ACCGGTTTCCTTGAAATT >2 AACCTTCCGGTTAATT >3 AACCTTCCGGTTAATT