Passage de variable awk et en les utilisant dans une expression régulière
Je suis en train d'apprendre awk et j'ai du mal à passer une variable dans le script ET de l'utiliser dans le cadre d'une regex modèle de recherche.
L'exemple est contraint, mais montre mon problème.
Mes données est la suivante:
Eddy Smith 0600000000 1981-07-16 Los Angeles
Frank Smith 0611111111 1947-04-29 Chicago
Victoria McSmith 0687654321 1982-12-16 Los Angeles
Barbara Smithy 0633244321 1984-06-24 Boston
Jane McSmithy 0612345678 1947-01-15 Chicago
Grace Jones 0622222222 1985-10-07 Los Angeles
Bernard Jones 0647658763 1988-01-01 New York
George Jonesy 0623428948 1983-01-01 New York
Indiana McJones 0698732298 1952-01-01 Miami
Philip McJonesy 0644238523 1954-01-01 Miami
Je veux un script awk que je peux passer une variable et ensuite le script awk faire une regex pour la variable.
J'ai ce script appelle maintenant "003_search_persons.awk".
#this awk script looks for a certain name, returns firstName, lastName and City
#print column headers
BEGIN {
printf "firstName lastName City\n";
}
#look for the name, print firstName, lastName and City
$2 ~ name {
printf $1 " " $2 " " $5 " " $6;
printf "\n";
}
J'appelle le script comme ceci:
awk -f 003_search_persons.awk name=Smith 003_persons.txt
Il renvoie la suivante, ce qui est bon.
firstName lastName City
Eddy Smith Los Angeles
Frank Smith Chicago
Victoria McSmith Los Angeles
Barbara Smithy Boston
Jane McSmithy Chicago
Mais maintenant, je veux chercher un certain préfixe "Mc". Je pourrais bien sûr coder en dur, mais je veux un script awk qui est flexible. J'ai écrit ce qui suit dans 003_search_persons_prefix.awk.
#this awk script looks for a certain prefix to a name, returns firstName, lastName and City
#print column headers
BEGIN {
printf "firstName lastName City\n";
}
#look for the prefix, print firstName, lastName and City
/^prefix/{
printf $1 " " $2 " " $5 " " $6;
printf "\n";
}
J'appelle le script comme ceci:
awk -f 003_search_persons_prefix.awk prefix=Mc 003_persons.txt
Mais maintenant il ne trouve pas les dossiers.
Le problème, c'est le modèle de recherche "/^préfixe/". Je sais que je peux remplacer ce modèle de recherche par un non-regex, comme dans le premier script, mais supposons que je veux le faire avec une regex, parce que j'ai besoin de le préfixe pour vraiment être au début du champ nom, comme il se doit, étant un préfixe et tous 😉
Comment puis-je faire cela?
- nettoyage de l'allée 5: se débarrasser de tous les null consolidés (en ajoutant des points-virgules), changement printf "\n" pour imprimer simplement "", et changer printf $1 "" $2 etc. simplement print $1, $2, etc.
Vous devez vous connecter pour publier un commentaire.
vous pouvez essayer ce
sortie
Regarder la awk documentation pour plus d'. (et de le lire du début à la fin!)
pat="^"name
dans un FNR==1 la section. Des variables de configuration avec l'option "-v" est préférable de toute façon mais si vous n'avez pas à contourner les variables n'étant pas renseignée dans la section.Modifier votre script pour:
et l'appeler comme
$0 ~ "^"
truc, c'est ce que je cherchais.Vous devriez être en mesure d'utiliser votre script original inchangé -
$2 ~ name
est déjà faire un regex de recherche donc, si vous appelez votre script avecname=^Mc
puis ce sera le retour des noms commençant par "Mc". En fait, ce n'est pas un bon exemple, car Mc apparaît seulement au début du nom - si vous utilisezname=^Smith
puis il va trouver les Smiths, mais pas le McSmiths.awk est spécifiquement requis? Je suis sûr que c'est tout à fait possible dans awk, mais je ne sais pas, si vous avez juste besoin de faire le travail, alors vous pouvez essayer. vous ne savez pas exactement ce que le séparateur est bien.