Ceci est un fichier partiel
N W N N N N N N N N N
N C N N N N N N N N N
N A N N N N N N N N N
N N N N N N N N N N N
N G N N N N N N N N N
N C N N N C N N N N N
N C C N N N N N N N N
Dans chaque ligne, je veux compter le nombre total de tous les caractères qui ne sont pas "N"
ma sortie désirée
1
1
1
0
1
2
2
text-processing
bioinformatics
Anna1364
la source
la source
sed
pour remplacer les trucs qui ne vous intéressent pas etawk
pour compter la longueur restantesed 's/N//g ; s/\s//g' file | awk '{ print length($0); }'
Réponses:
Solution GNU awk :
FPAT='[^N[:space:]]'
- le motif définissant une valeur de champ (n'importe quel caractère saufN
char et blanc)La sortie attendue:
la source
la source
awk '{print gsub(/[^ N]/,"")}'
en supposant que le comptage est nécessaire pour chaque ligne autre que le caractère espace et
N
tr
est le nombre de caractères remplacésc
pour compléter l'ensemble de caractères donné-l
option, supprime le caractère de nouvelle ligne de la ligne d'entrée pour éviter les erreurs hors ligne et ajoute également un caractère de nouvelle ligne pour l'instruction d'impressionUne solution plus générique
-a
option pour diviser automatiquement la ligne d'entrée sur les espaces blancs, enregistrée dans le@F
tableaugrep {$_ ne "N"} @F
renvoie un tableau de tous les éléments dans@F
lesquels ne correspond pas à la chaîneN
grep {!/^N$/} @F
scalar
donnera le nombre d'éléments du tableaula source
Solution alternative awk :
gsub(...)
- Lagsub()
fonction renvoie le nombre de substitutions effectuées.Le résultat:
la source
Une autre
awk
approche (retournera -1 pour les lignes vides).Ou en complexe, il renverra -1 sur les lignes vides, 0 sur les espaces blancs (tabulations / espaces) uniquement.
la source
-1
pour les lignes vides ... mais alors cela pourrait être souhaitable pour distinguer la ligne composée uniquement de N / espace par rapport à la ligne vide ...tr
et script shell POSIX :bash
,,ksh
etzsh
:la source
awk '{print length()}'
pour éviter le bouclage plus lent du shell .. mais alors on pourrait tout faire avec awk lui-même ...awk
boucle est plus rapide que la boucle shell. Mais le shell est toujours en mémoire, etawk
peut-être pas - lorsqu'ilawk
n'est pas déjà chargé, ou échangé, la surcharge de chargement, ( le temps perdu ), peut être supérieure à l'avantage de l'exécutionawk
- en particulier sur un petit boucle. Dans de tels cas ( c'est-à - dire dans ce cas),awk
peut être plus lent .awk
dans un script shell pourrait faire un tel système à quatre pattes. Généralement: la même traînée de latence s'applique aux systèmes à micrologiciel limité ou à tout système soumis à une charge élevée.Une courte combinaison de
tr
etawk
:Cela supprime tous les espaces et N du fichier d'entrée et
awk
imprime simplement la longueur de chaque ligne.la source
Un autre moyen simple est de le faire en python, qui est pré-installé dans la plupart des environnements Unix. Déposez le code suivant dans un fichier .py:
Et puis:
Depuis votre terminal. Ce qui précède est:
la source