J'ai un fichier délimité par des tabulations qui ressemble à ceci:
gene v1 v2 v3 v4
g1 NA NA NA NA
g2 NA NA 2 3
g3 NA NA NA NA
g4 1 2 3 2
Le nombre de champs dans chaque ligne est fixe et identique. Je veux supprimer ces lignes du fichier ci-dessus où tous les champs pour chaque ligne de la colonne 2 à la dernière sont NA. Ensuite, la sortie devrait ressembler à:
gene v1 v2 v3 v4
g2 NA NA 2 3
g4 1 2 3 2
text-processing
awk
perl
bioinformatics
user3138373
la source
la source
\s\d
différencie les «bonnes» et les «mauvaises» lignes.is.na
vérifiant si je penseRéponses:
Avec
awk
:Parcourez les champs à partir du deuxième champ et imprimez la ligne si un champ ne contenant pas
NA
est trouvé. Brisez ensuite la boucle.la source
Utiliser GNU sed
Brève explication:
g[0-9]\+\(\s*NA\s*\)\+$
est une correspondance d'expression régulièreg
suivie d'au moins un chiffre, puis d'un nombre quelconque deNA
s avec des espaces facultatifs entre les deux jusqu'à la fin de la ligne.sed -e '/<regex>/d'
supprime toutes les lignes qui correspondent<regex>
Une expression rationnelle plus standard avec la même signification serait:
la source
\+
et\s
sont des expressions régulières non standard et correspondent simple+
ous
dans la plupart dessed
versions. Utilisez\{1,\}
au lieu de\+
et[[:space:]]
au lieu d'\s
avoir un code portable.Avec
all
du module Perl List :: Util:la source
Avec
grep
:Ceci fait que grep n'affiche pas les
-v
lignes ( ) où la ligne entière (-x
) correspond:la source
{4}
lieu de*
après leNA
groupe, et vous voudrez peut - être changer le premier[[:blank:]]*
à[[:blank:]]+
faire les séparateurs d'espaces blancs obligatoires. Quoi qu'il en soit, je n'ai jamais compris pourquoi tout le monde insiste pour retirer leawk
bazooka pour résoudre ces simples problèmes de filtrage qui segrep
gèrent facilement.*
afin que cette solution fonctionne aussi bien pour n'importe quel nombre arbitraire deNA
colonnes, tant qu'elles sont toutes NA.Tu pourrais essayer:
la source