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.

Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top