Comment puis-je compter le nombre de numéros scientifiques dans un fichier? Le fichier contient également quelques lignes d'en-tête qui doivent être ignorées.
Une partie du contenu du fichier se trouve ci-dessous.
FileHeaderLine1
FileHeaderLine2
FileHeaderLine3
FileHeaderLine4
2.91999996E-001 2.97030300E-001 3.02060604E-001 3.07090908E-001 3.12121212E-001 3.17151517E-001
3.22181821E-001 3.27212125E-001 3.32242429E-001 3.37272733E-001 3.42303038E-001 3.47333342E-001
3.52363646E-001 3.57393950E-001 3.62424254E-001 3.67454559E-001 3.72484863E-001 3.77515137E-001
3.82545441E-001 3.87575746E-001 3.92606050E-001 3.97636354E-001 4.02666658E-001 4.07696962E-001
4.12727267E-001 4.17757571E-001 4.22787875E-001 4.27818179E-001 4.32848483E-001 4.37878788E-001
4.42909092E-001 4.47939396E-001 4.52969700E-001
Alors, comment puis-je ignorer les quatre premières lignes de l'exemple ci-dessus et compter le nombre de nombres scientifiques dans le fichier?
looks_like_number
Utiliser GNU grep
Vous pouvez utiliser
grep
pour ce faire, en utilisant les fonctionnalités PCRE. Par ailleurs, le même modèle peut également être utilisé en Perl:Vous pouvez également utiliser
wc -w
pour compter les mots, je compte les lignes ci-dessus, mais legrep
retourne une seule correspondance sur une ligne, donc cela n'a pas vraiment d'importance dans ce scénario.Utiliser Perl
Pour Perl, vous pouvez utiliser cette doublure:
Références
la source
egrep
marchera:METTRE À JOUR:
si une ligne contenait à la fois un nombre et une autre chaîne, nous pouvons utiliser
awk
pour résoudre le problème:la source
-oP
option mentionnée dans la réponse slm auparavant, mais j'ai résolu mon problème en utilisantawk
@JohnnyEn supposant que vous n'avez que des chiffres scientifiques après la 4e ligne, vous pouvez faire quelque chose comme ci-dessous.
Pour l'entrée que vous avez fournie, la sortie est 33 après l'exécution de la commande ci-dessus.
la source
Si vous avez simplement besoin de compter le nombre de champs délimités par des espaces suivant les lignes d'en-tête en perl, je pense que vous pourriez simplement faire
Si vous avez vraiment besoin de compter uniquement des nombres au format scientifique, une approche pourrait être de rechercher et de remplacer des nombres selon une expression rationnelle appropriée , puis de compter le nombre de remplacements (l'expression de substitution perl renvoie le nombre de remplacements lorsque vous le liez à une variable )
la source
Tout dépend de ce que vous voulez réellement considérer comme un numéro scientifique , de ce que vous pouvez vous attendre à ce que votre entrée contienne et où vous pouvez accepter de trouver ces nombres dans l'entrée.
Par exemple, dans:
Je peux trouver 0 ou 2 (inf et 2E2000) ou 3 (inf, 2E200, 0) nombres (ou poussés à l'extrême, en recherchant toutes les séquences de caractères qui forment un nombre valide: 17 (inf, 2, 2E2, 2E20, 2E200, 2E200, 2E2000, 2, 20, 200, 2000, 0, 00, 000, 0, 00, 0)).
Si vous savez que votre entrée ne contient que des chiffres dans le X.XXXXXXXXE-XXX et qu'ils sont sur des mots qui leur sont propres, il peut être plus sûr de chercher juste cela dans des mots entiers comme:
L'idée est d'obtenir un mot par ligne et de faire correspondre la ligne entière (
-x
) avec le motif souhaité. Pour autoriser n'importe quel numéro de notation scientify (-1.2e + 1234 ... tant qu'il y a une
ouE
), vous pouvez changer le modèle en:Ou rendez la
e...
partie facultative pour autoriser toutes sortes de nombres décimaux à virgule flottante:Tout cela donne la même réponse pour votre entrée spécifique, mais là où cela ferait une différence, c'est là où il y a une entrée qui s'écarte du modèle strict montré dans votre échantillon.
la source