4 votes

utiliser awk pour compter le nombre d'occurrences d'un motif provenant d'un autre fichier

J'essaie de prendre un fichier contenant une liste et de compter combien de fois les éléments de cette liste sont présents dans un fichier cible :

list.txt
blonde
red
black

target.txt
bob blonde male
sam blonde female

desired_output.txt
blonde 2
red 0
black 0

J'ai coopté le code suivant pour obtenir les valeurs présentes dans target.txt :

awk '{count[$2]++} END {for (word in count) print word, count[word]}' target.txt

Mais le résultat n'inclut pas les éléments souhaités qui se trouvent dans le fichier liist.txt mais pas dans le fichier target.txt.

current_output.txt
blonde 2

J'ai essayé plusieurs choses pour que cela fonctionne, notamment :

awk '{word[$1]++;next;count[$2]++} END {for (word in count) print word, count[word]}' list.txt target.txt

Cependant, je n'ai pas réussi à obtenir gain de cause.

Quelqu'un pourrait-il m'aider à faire en sorte que cette instruction awk lise le fichier key.txt ? Toute explication du code serait également très appréciée. Merci d'avance pour votre aide.

4voto

Quasímodo Points 161
awk '
  NR==FNR{a[$0]; next}
  {
    for(i=1; i<=NF; i++){
      if ($i in a){ a[$i]++ }
    }
  }
  END{
    for(key in a){ printf "%s %d\n", key, a[key] }
  }
' list.txt target.txt
  • NR==FNR{a[$0]; next} La condition NR==FNR n'est vrai que pour le premier fichier, donc les clés du tableau a sont des lignes de list.txt .

  • for(i=1; i<=NF; i++) Pour le deuxième fichier, il s'agit d'une boucle sur tous les fichiers ses champs.

    • if ($i in a){ a[$i]++ } Cela permet de vérifier si le champ $i est présent en tant que clé dans le tableau a . Si oui, la valeur (initialement nulle) associée à cette clé est incrémentée.
  • A l'occasion de la END nous imprimons simplement le key suivi du nombre d'occurrences a[key] et une nouvelle ligne ( \n ).

Sortie :

blonde 2
red 0
black 0

Notes :

  1. En raison de %d , le printf force la conversion de a[key] à un entier au cas où il ne serait pas encore défini. L'ensemble de la déclaration pourrait être remplacé par une déclaration plus simple print key, a[key]+0 . Cela m'a échappé en écrivant la réponse, mais maintenant vous savez qu'il y a deux façons de faire la même chose ;)

  2. Dans votre tentative, vous n'avez abordé, pour une raison quelconque, que le champ 2 ( $2 ), en ignorant les autres colonnes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X