Comment utiliser getline dans AWK avec une commande qui est concaténés
Question
Ce me rend fou. Tout ce que je veux faire est de passer une commande à la borne de awk, où la commande est une chaîne concaténés fait à partir d'autres variables.
La documentation awk dit que quelque chose comme
"echo" $1 | getline var
devrait mettre la valeur de 1 $ dans var. Mais ce n'est pas le cas. Qu'est-ce que j'oublie ici?
Je dois ajouter que je fait une boucle
for ( i = 1; i <=NF ; i=i+1 )
{
"echo" $i | getline var
printf var " "
}
printf "\n"
pour inputfile comme
0 2
1 2
sorties
0 0
0 0
ce que l'enfer.
La solution
Eh bien, il se trouve son pas un bug.
Ce qui est en cours est le getline ouvre un nouveau fichier, et en fonction de vos paramètres système, vous ne pouvez avoir des fichiers ouverts X par programme. Une fois que vous max sur les fichiers ouverts, getline ne peut pas ouvrir toute nouvelle de fd. La solution est que vous devez appeler
for ( i = 1; i <=NF ; i=i+1 )
{
command="echo" $i
command | getline var
close(command)
printf var " "
}
printf "\n"
Certes, ce point est subtil et il devrait être énormes signes d'avertissement dans la documentation à ce sujet! Quoi qu'il en soit, je suis content d'avoir résolu.
Autres conseils
J'ai trouvé deux problèmes avec votre échantillon. Votre « echo » devrait être « l'écho » (au moins pour moi « echo » ne fonctionne pas), et votre printf est manquant le format arg.
for ( i = 1; i <=NF ; i=i+1 ) {
"echo " $i | getline var;
printf "%s ", var ;
}
si vous voulez valeurs concaténer
var=$(awk 'BEGIN{cmd="command "}
{
for (i=1;i<=NF;i++){
cmd = cmd" "$i
}
}
END {
# pass to shell
print cmd
}' file)
$var