Outils pour utilisateurs

Outils du site


informatique:awk

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
informatique:awk [2020/10/11 02:39] alexisinformatique:awk [2023/01/04 20:46] (Version actuelle) – [Remplacer le séparateur d'un fichier] alexis
Ligne 5: Ligne 5:
 === FILENAME — nom du fichier courant === === FILENAME — nom du fichier courant ===
 La variable ''FILENAME'' contient le nom du fichier courant. La variable ''FILENAME'' contient le nom du fichier courant.
 +<WRAP prewrap>
 <code bash> <code bash>
 awk '{print FILENAME}' <fichier> awk '{print FILENAME}' <fichier>
 </code> </code>
 +</WRAP>
  
 === FNR — nombre d'enregistrements lus dans le fichier courant === === FNR — nombre d'enregistrements lus dans le fichier courant ===
 La variable ''FNR'' contient le nombre d'enregistrements lus dans le fichier courant. La variable ''FNR'' contient le nombre d'enregistrements lus dans le fichier courant.
 Le compteur d'enregistrements s'initialise entre chaque fichier. Le compteur d'enregistrements s'initialise entre chaque fichier.
 +<WRAP prewrap>
 <code bash> <code bash>
 awk '{print FNR}' <fichier1> <fichier2> awk '{print FNR}' <fichier1> <fichier2>
 </code> </code>
 +</WRAP>
  
 === FS — Séparateur de champs === === FS — Séparateur de champs ===
 La variable ''FS'' est utilisée pour changer la valeur du séparateur de champs. La variable ''FS'' est utilisée pour changer la valeur du séparateur de champs.
 Par défaut, l'espace et la tabulation sont utilisés. Par défaut, l'espace et la tabulation sont utilisés.
 +<WRAP prewrap>
 <code bash> <code bash>
 # Initialisation de la variable dans la liste de commande # Initialisation de la variable dans la liste de commande
Ligne 26: Ligne 31:
 awk -F'=' '{print $1}' <fichier> awk -F'=' '{print $1}' <fichier>
 </code> </code>
 +</WRAP>
 +
 +<WRAP info>
 +Le séparateur de champ peut être une expression rationnelle.
 +<WRAP prewrap>
 +<code bash>
 +# Initialisation de la variable dans la liste de commande
 +awk 'BEGIN { FS="[=_]" } { print $1 }' <fichier>
 +
 +# Initialisation de la variable par l'option du programme
 +awk -F'[=_]' '{print $1}' <fichier>
 +</code>
 +</WRAP>
 +</WRAP>
 +
  
 === NF — Nombre de champs === === NF — Nombre de champs ===
 La variable ''NF'' contient le nombre de champs de l'enregistrement courant. La variable ''NF'' contient le nombre de champs de l'enregistrement courant.
 +<WRAP prewrap>
 <code bash> <code bash>
 awk '{print NF}' <fichier> awk '{print NF}' <fichier>
 </code> </code>
 +</WRAP>
  
 === NR — Nombre d'enregistrements lus === === NR — Nombre d'enregistrements lus ===
 La variable ''NR'' contient le nombre total d'enregistrements lus. La variable ''NR'' contient le nombre total d'enregistrements lus.
 Le compteur d'enregistrements ne s'initialise pas entre chaque fichier. Le compteur d'enregistrements ne s'initialise pas entre chaque fichier.
 +<WRAP prewrap>
 <code bash> <code bash>
 awk '{print NR}' <fichier1> <fichier2> awk '{print NR}' <fichier1> <fichier2>
 </code> </code>
 +</WRAP>
  
 === OFS — Séparateur de champs de la sortie === === OFS — Séparateur de champs de la sortie ===
 La variable ''OFS'' est utilisée pour changer la valeur du séparateur de champs de la sortie. La variable ''OFS'' est utilisée pour changer la valeur du séparateur de champs de la sortie.
 Par défaut, l'espace est utilisée. Par défaut, l'espace est utilisée.
 +<WRAP prewrap>
 <code bash> <code bash>
 awk 'BEGIN { OFS=":" } { print $1 }' <fichier> awk 'BEGIN { OFS=":" } { print $1 }' <fichier>
 </code> </code>
 +</WRAP>
  
 ===== Scripts ===== ===== Scripts =====
 ==== Remplacer les clefs par les valeurs ==== ==== Remplacer les clefs par les valeurs ====
 +<WRAP prewrap>
 <code awk> <code awk>
 # fichier_1 contient l'association entre les clefs et les valeurs : # fichier_1 contient l'association entre les clefs et les valeurs :
Ligne 68: Ligne 95:
 # ID4 30 # ID4 30
 </code> </code>
 +</WRAP>
   * ''%%FNR==NR%%'' permet l'exécution du bloc suivant uniquement lors de la lecture du premier fichier.   * ''%%FNR==NR%%'' permet l'exécution du bloc suivant uniquement lors de la lecture du premier fichier.
   * ''%%a[$1]=$2%%'' permet de créer un tableau associatif avec les valeurs trouvées.   * ''%%a[$1]=$2%%'' permet de créer un tableau associatif avec les valeurs trouvées.
Ligne 74: Ligne 102:
  
 ==== Afficher la date courante ==== ==== Afficher la date courante ====
 +<WRAP prewrap>
 <code awk> <code awk>
 awk '{ "date +%d-%b-%Y" | getline; print }' awk '{ "date +%d-%b-%Y" | getline; print }'
 </code> </code>
 +</WRAP>
   * ''%%date +%d-%b-%Y%%'' est l'appel à la commande ''date'' du système. Le format dépend donc de la commande et non pas de awk.   * ''%%date +%d-%b-%Y%%'' est l'appel à la commande ''date'' du système. Le format dépend donc de la commande et non pas de awk.
   * ''%%getline%%'' permet de stocker la date dans une variable.   * ''%%getline%%'' permet de stocker la date dans une variable.
Ligne 83: Ligne 112:
 ==== Afficher toutes les trois lignes d'un fichier ==== ==== Afficher toutes les trois lignes d'un fichier ====
   * En commençant à la première ligne   * En commençant à la première ligne
 +<WRAP prewrap>
 <code awk> <code awk>
 awk '(NR%3 == 1){print $0}' awk '(NR%3 == 1){print $0}'
 </code> </code>
 +</WRAP>
   * En commençant à la deuxième ligne   * En commençant à la deuxième ligne
 +<WRAP prewrap>
 <code awk> <code awk>
 awk '(NR%3 == 2){print $0}' awk '(NR%3 == 2){print $0}'
 </code> </code>
 +</WRAP>
   * En commençant à la troisième ligne   * En commençant à la troisième ligne
 +<WRAP prewrap>
 <code awk> <code awk>
 awk '(NR%3 == 0){print $0}' awk '(NR%3 == 0){print $0}'
Ligne 97: Ligne 131:
 awk '(NR%3){print $0}' awk '(NR%3){print $0}'
 </code> </code>
 +</WRAP>
  
 ==== Faire des statistiques d'appels ==== ==== Faire des statistiques d'appels ====
  
 Dans le journal des évènements d'une API contenant la liste des URI appelées, je veux compter les types d'appels en sachant que l'anatomie d'une URI est la suivante : ''/xxx/type/id'' Dans le journal des évènements d'une API contenant la liste des URI appelées, je veux compter les types d'appels en sachant que l'anatomie d'une URI est la suivante : ''/xxx/type/id''
 +<WRAP prewrap>
 <code bash> <code bash>
 # trouver le nombre d'appels par type # trouver le nombre d'appels par type
Ligne 124: Ligne 160:
 39242 39242
 </code> </code>
 +</WRAP>
  
 ==== Afficher le dernier champ de chaque ligne ==== ==== Afficher le dernier champ de chaque ligne ====
 En faisant astucieusement usage de la variable ''NF'' ((Astuce trouvée sur [[https://unix.stackexchange.com/questions/145672/print-last-element-of-each-row/145673#145673|Unix & Linux Stack Exchange]] En faisant astucieusement usage de la variable ''NF'' ((Astuce trouvée sur [[https://unix.stackexchange.com/questions/145672/print-last-element-of-each-row/145673#145673|Unix & Linux Stack Exchange]]
 )) ))
 +<WRAP prewrap>
 <code bash> <code bash>
 awk '{print $NF}' <fichier> awk '{print $NF}' <fichier>
 </code> </code>
 +</WRAP>
  
 ==== Remplacer le séparateur d'un fichier ==== ==== Remplacer le séparateur d'un fichier ====
-En assignant la variable ''$1'' à ''$1'' modifie la valeur du champ ce qui force ''awk'' à reconstruire l'enregistrement ''$0''.+En assignant la variable ''$1'' à ''$1'', cela modifie la valeur du champ ce qui force ''awk'' à reconstruire l'enregistrement ''$0''.
 La reconstruction de l'enregistrement remplace le séparateur ''FS'' par ''OFS''. La reconstruction de l'enregistrement remplace le séparateur ''FS'' par ''OFS''.
 +<WRAP prewrap>
 <code bash> <code bash>
-awk -F',' 'BEGIN { OFS="|" } { $1=$1 } 1' <fichier>+# Ici, 1 équivaut à true, ce qui affiche la ligne complète 
 +awk 'BEGIN { FS=","; OFS="|" } { $1=$1 } 1<fichier> 
 + 
 +# Cette écriture est donc équivalente 
 +awk 'BEGIN { FS=","; OFS="|" } { $1=$1; print $0 }' <fichier>
 </code> </code>
-<WRAP todo> 
-Comprendre pourquoi j'ai le ''1'' à la fin de la commande. 
 </WRAP> </WRAP>
 +
 +==== Calculer la somme des champs d'un fichier ====
 +<code bash>
 +awk '{ somme += $1 } END { print somme }' <fichier>
 +</code>
  
 ===== Liens ===== ===== Liens =====
informatique/awk.1602409165.txt.gz · Dernière modification : 2020/10/11 02:39 de alexis