2013-05-17 3 views
1

Je me demande comment je peux supprimer des lignes d'un ensemble de données contenant plus d'un certain nombre de caractères, en fonction de la somme de deux lignes.Supprimer les lignes en fonction du nombre de caractères

Par exemple, les données suivantes:

2 rs121065 0 17696224 T C 
2 rs1860485 0 17696230 T C 
2 rs237147 0 17696256 C CGAGGCAG 
2 rs1909633 0 17696365 A G 
2 rs574724 0 17696368 T C 

Je voudrais supprimer la troisième ligne. Le problème est que la série de lettres est variable, et ainsi dans d'autres endroits, les données peuvent ressembler à ceci:

2 rs113308 0 17683654 CCTTT C 

ou ceci:

2 rs103371 0 17667279 TG T 

donc - en gros, une ligne qui contient plus de 2 caractères dans les deux dernières colonnes doivent être supprimés, et idéalement mon jeu de données ressemblera à ceci:

2 rs121065 0 17696224 T C 
2 rs1860485 0 17696230 T C 
2 rs1909633 0 17696365 A G 
2 rs574724 0 17696368 T C 

Toutes les suggestions sont grandement appréciés!

+0

Quand vous dites « plus de 2 caractères » que cela veut dire que vous voulez garder une ligne qui a 2 caractères dans l'une des colonnes? c'est-à-dire que vous voulez vraiment dire "plus d'un personnage"? – GSee

+0

Supprimer les lignes contenant plus d'un caractère avant la sommation des deux dernières colonnes, ou plus de deux caractères après la sommation. – mfk534

Répondre

6

Une solution à base de R. Disons que les colonnes focales sont appelées seq1 et seq2.

Puis

mydata <- subset(mydata,nchar(seq1)+nchar(seq2)==2) 

ou si vous voulez vraiment utiliser les deux dernières colonnes,

nc <- ncol(mydata) 
mydata <- mydata[nchar(mydata[,ncol-1])+nchar(mydata[,ncol])==2,] 

mais je trouve l'ancien plus facile à lire.

+0

Exactement ce dont j'avais besoin. Je vous remercie! – mfk534

+1

+1 peut-être 'avec 'rendrait la seconde plus lisible. En utilisant ceci, on éviterait de s'appuyer sur une fonction destinée uniquement à un usage interactif. –

+1

hm .. semble besoin d'apprendre une langue de plus - c'est un peu cryptique pour moi :) – jm666

4

Une awk solution à base:

$ cat foo.txt 
2 rs121065 0 17696224 T C 
2 rs1860485 0 17696230 T CG 
2 rs237147 0 17696256 C CGAGGCAG 
2 rs1909633 0 17696365 A GGG 
2 rs574724 0 17696368 T C 

$ awk 'length($NF)==1 && length($(NF-1))==1' foo.txt 
2 rs121065 0 17696224 T C 
2 rs574724 0 17696368 T C 

Cela permet de maintenir uniquement les lignes dont les deux dernières colonnes ne comportent qu'un seul caractère chacun. Ajustez l'exigence de longueur au besoin, ce qui devrait être explicite.

+0

Merci! C'est bien d'avoir des options. – mfk534

+0

que l'on est clair :);) – jm666

1

simples sed ½ doublure:

sed '/\w\{2\}\s*\w*$/d' file 
Questions connexes