À laide dun script awk, comment compter le nombre de champs dans lesquels une sous-chaîne se trouve dans un fichier?

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.

  • @JohnMike, eh bien, ' est exactement ce quil vous faut , Je déteste vraiment donner des réponses complètes aux devoirs. Cela devrait concerner toutes les pièces, cependant, si vous avez le temps dessayer den construire quelque chose.
  • Je ne ' t, et je normalement ' ne demanderait pas de réponses complètes, mais je crains d’obtenir un A dans cette classe. Je ' suis un élève A droit, et je nai généralement aucun problème avec mes cours de science-fiction, mais ce professeur est connu pour sattendre à des connaissances hors classe. Je ' n’ai jamais utilisé unix / linux auparavant, et j’ai vraiment du mal ici. Le devoir se compose de 20 problèmes, et ces 3, plus 2 dans un autre article que jai rédigé, sont les seuls que je puisse ' trouver. Je suis à court de temps, il ' est prévu pour demain.
  • @JohnMike, essayez si vous pouvez rassembler quelques pièces?SE est nul pour le débogage interactif en va-et-vient, mais vous pouvez modifier votre Q pour ajouter un script si vous obtenez un ou deux pas en avant, puis nous pouvons voir ce que ' est le stopper
  • @JohnMike Considérant (a) la manière illustrée ici pour parcourir les champs de chaque enregistrement en utilisant la boucle for, (b) 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 

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *