Le script Awk n'attrape pas le symbole de hachage «#»

Sep 11 2020

Comment puis-je obtenir awk d'ignorer les enregistrements commençant par un commentaire tout en conservant tous les autres enregistrements? Le script awk ci-dessous n'ignore pas les enregistrements commençant par un symbole de hachage dans cet exemple de fichier de test. Il saute également l' numpyenregistrement.

Fichier de test
# Version numbers have been retrieved from a range of machines and environments.
# Take them with a grain of salt.

# Direct dependencies
#python==3.6.0
#pip==9.0.1
#setuptools==38.2.4  # old for MarkupSafe 1.0 (28.8.0 is installed with py 3.6)
numpy==1.12.1  # 1.12.0
pandas==0.19.2
Script Awk
#! /usr/bin/awk -f

BEGIN { 
  regex=/^[a-zA-Z]+\S+/ 
  n=0
}

$1 ~ regex {print $1; n++};

END{
  {print "\n# \n# End proccessing of "FILENAME" \n# Original file had "NR" records\n# Current file record count is "n};
  { if(NR>=n) print "#\n# Mattached all records"};
}
Sortie (ignorer les barres)
|| #python==3.6.0
|| #pip==9.0.1
|| pandas==0.19.2
|| 
|| # 
|| # End proccessing of requirements.txt 
|| # Original file had 9 records
|| # Current file record count is 3
|| #
|| # Mattached all records

Réponses

2 EdMorton Sep 11 2020 at 07:49

regex=/^[a-zA-Z]+\S+/signifie « comparer $0à /^[a-zA-Z]+\S+/et enregistrer le résultat dans la variable regex» alors regexsera 1 ou 0 à la suite de cette cession et puisque nous sommes dans la BEGINsection où aucune ligne ont lu et donc $ 0 est toujours vide, il est équivalent à regex=0.

\Sest une extension GNU awk, ce qui signifie [^[:space:]]que si vous utilisiez GNU awk - elle prend également en charge les constantes d'expression régulière fortement typées (voirhttps://www.gnu.org/software/gawk/manual/gawk.html#Strong-Regexp-Constants). Dans cet esprit, vous pouvez faire (notez le @symbole):

$ seq 5 | awk 'BEGIN{re=@/3/} $0 ~ re'
3

mais seulement dans GNU awk.

Dans toute autre variante awk (qui étant donné que vous dites que vous utilisez la version, 20070501je suppose que vous utilisez une variante BSD), le mieux que vous puissiez faire est d'utiliser une expression rationnelle dynamique:

$ seq 5 | awk 'BEGIN{re="3"} $0 ~ re'
3
1 ThomasDickey Sep 11 2020 at 05:30

Ce n'est pas un modèle awk (ressemble à perl):

regex=/^[a-zA-Z]+\S+/ 

quelque chose comme ça fonctionnerait:

regex="^[a-zA-Z]+[^[:space:]]+"

En outre, votre modèle doit correspondre $0(non $1). $0est la ligne entière. $1est le premier champ (considérez-le comme le premier mot de chaque ligne: qui peut ne pas avoir #de correspondance dans la première colonne).

Avec ces deux corrections, votre exemple fonctionne pour moi ...