Définir la variable dans le shell actuel à partir de awk
Est-il un moyen de définir une variable dans mon shell courant de l'intérieur de awk
?
J'aimerais effectuer un traitement sur un fichier et d'impression de certaines données; puisque je vais lire le fichier en entier par le biais, je voudrais enregistrer le nombre de lignes-dans ce cas, FNR
.
Qui se passe si je n'arrive pas à trouver une manière de définir une variable d'environnement avec FNR
valeur; si pas, je dois le lire la FNR
de mon fichier de sortie, à définir, dire num_lines
avec FNR
valeur.
J'ai essayé quelques combinaisons à l'aide awk 'END{system(...)}'
mais ne pouvait pas gérer à travailler. Moyen de contourner ce problème?
source d'informationauteur Rubens
Vous devez vous connecter pour publier un commentaire.
Voici pourquoi vous devriez utiliser déclarer au lieu de eval:
Note dans le premier cas que eval exécute quelle que soit la chaîne de awk estampes, qui pourrait accidentellement être une très mauvaise chose!
Voici une autre façon.
Ceci est particulièrement utile quand vous avez la valeurs de vos variables dans un unique variable et que vous souhaitez diviser. Par exemple, vous avez une liste de valeurs à partir d'une seule ligne dans une base de données que vous souhaitez créer des variables.
Nous avons besoin de la "ici string' je.e <<< dans ce cas, parce que la commande de lecture ne permet pas de lire à partir d'un tuyau et de les lire depuis l'entrée standard stdin
Vous ne pouvez pas exporter des variables à partir d'un shell interne est exécuté à son parent shell. Vous avez d'autres choix, y compris:
Faire un autre passage du fichier à l'aide de AWK pour compter le nombre d'enregistrements, et l'utilisation de la substitution de commande pour enregistrer le résultat. Par exemple:
wc -l < filename
pour obtenir votre compte.Un avertissement pour ceux qui cherchent à utiliser déclarer comme suggéré par plusieurs réponses.
eval n'ont pas ce problème.
Si le awk (ou toute autre expression) à condition de déclarer les résultats dans une chaîne vide, puis déclarer sera le vidage de l'environnement.
Ce n'est presque certainement pas ce que vous souhaitez.
par exemple: si votre awk modèle n'existe pas dans l'entrée, vous n'aurez jamais l'impression d'une sortie, donc vous allez vous retrouver avec un comportement inattendu.
Un exemple....
Un changement mineur pour stocker la valeur à affecter à une variable awk et de l'imprimer à la fin résout ce....
De montrer ce travail avec un motif de reconnaissance
Faire
awk
imprimer l'instruction d'affectation:Puis dans votre script shell,
eval
la sortie de votreawk
script:EDIT: les gens vous recommandons d'utiliser
declare
au lieu deeval
soit un peu moins sujettes à l'erreur si quelque chose d'autre que la cession est imprimé par le script interne. C'est bash seule, mais c'est pas grave, quand la coquille est bash et le script a#!/bin/bash
correctement indiquant cette dépendance.La
eval $(...)
variante est largement utilisée, avec des programmes existants générant de sortie adapté poureval
mais pas pourdeclare
(lesspipe
est un exemple); c'est pourquoi il est important de le comprendre, et le bash seule variante est "trop localisée".De synthétiser tout ici, jusqu'à présent, je vais partager ce que je trouve est utile de définir une variable d'environnement shell à partir d'un script qui lit une ligne d'un fichier à l'aide de awk. Évidemment une
/pattern/
pourrait être utilisé à la place deNR==1
de trouver le nécessaire variable.Cela permet d'éviter une sortie massive de variables si un
declare
de commande est émis avec aucun argument, ainsi que les risques de sécurité d'un aveugleeval
.