Par exemple, jai le document texte:
"Hello, I am the janitor and I have a headache The rabbit jumped over the red brick wall"
Je veux compter le nombre de champs dans lesquels la sous-chaîne « il » apparaît. Je ne veux pas compter le nombre de « il » dans le fichier, juste le nombre de champs.
Donc, pour mon exemple, il devrait afficher quelque chose comme ceci:
Number of fields that contain "he" in record #1: 3 Number of fields that contain "he" in record #2: 2
Il doit sagir dun script awk.
Commentaires
- Quavez-vous essayé jusquà présent?
- Jai essayé le script suivant: " {print " Nombre de champs dans lenregistrement # " NR " contenant ' il ': " index ($ 0, " il ")} et cela ne fonctionne ' t. Jai aussi essayé gsub, mais gsub compte chaque occurrence de ' he ', pas seulement les champs dans lesquels ' il ' est trouvé.
- Vous devez parcourir les champs. Cela devrait vous aider.
- Avez-vous abandonné unix.stackexchange.com/questions / 550529 / … ?
- @JohnMike également, veuillez mettre vos tentatives & leurs résultats dans votre question , où ils nont ' pas été ignorés.
Réponse
Les champs sont numérotés à partir de 1
et NF
contient le nombre dentre eux. On peut donc les parcourir avec for (i = 1; i <= NF; i++) { ... }
, avec $i
à lintérieur de la boucle se référant au champ en question. (i
est en fait juste le numéro du champ, nous avons besoin de lopérateur $
pour obtenir le contenu réel du champ.)
Et comme pour savoir si une valeur contient une sous-chaîne particulière, utiliser une expression régulière est plus simple. s ~ /foo/
verrait si la variable s
correspond à la chaîne foo
nimporte où, cest-à-dire si elle contient il en tant que sous-chaîne. Maintenant, vous pouvez également vouloir faire correspondre une lettre majuscule, auquel cas par exemple [Ff]
fonctionnerait à la place de f
. Le groupe de parenthèses [...]
correspond à nimporte lequel des caractères à lintérieur.
Bien sûr, vous aurez également besoin dun compteur, mais cest facile, initialisez simplement une variable à zéro avant la boucle (par exemple count=0
) et incrémenter sil y a « une correspondance (count += 1
).
~ ~
Donc, fondamentalement, un script awk pour exécuter du code pour chaque ligne / enregistrement dun fichier est juste
awk "{ some code }" < filename.txt
À lintérieur du bloc de code, la boucle for
sadapte, et elle prend également un bloc entre accolades { .. }
.
awk "{ for ( ... ) { some code } }`
Et un if
fonctionne de la même manière,
if (condition) { some code... }
(Ils ont en fait comme for
et if
en C.)
Et vous pouvez utiliser des points-virgules pour séparer les instructions, donc
awk "{ what to do before the loop; for ( ... ) { some code }; what to do after }`
Commentaires
- À quoi cela ressemblerait-il en tant que fichier de script complet? e1 168a2e1b « >
m à perte totale. Notre professeur na ' pas parlé de ça.
gsub
que vous avez essayé votre message abandonné peut accepter une cible à exécuter, cest-à-dire gsub("he","",$i)
(c) vous avez une formation de base en science-fiction (d) vous pouvez utiliser des outils en ligne comme tutorialspoint.com/execute_bash_online.php pour faire vos devoirs même si vous navez pas Linux dans votre PC, alors il ny a aucune excuse forte pour ne pas essayer de résoudre vos devoirs avec laide donnée ici. Essayez au moins, et laide arrivera. Réponse
Fait par le script awk ci-dessous
awk -v i="he" "{print "Number of fields that contain" " " i " " gsub("he",$0) " " "in record " NR}" file
sortie
Number of fields that contain he 3 in record 1 Number of fields that contain he 2 in record 2