Pregunta

Esto me está volviendo loco. Todo lo que quiero hacer es pasar un comando al terminal desde awk, en el que el comando es una cadena concatenados juntos a partir de otras variables.

La documentación de awk dice que algo como

"echo" $1 | getline var

debe poner el valor de $ 1 en var. Pero este no es el caso. ¿Que me estoy perdiendo aqui?

Debería añadir que en realidad tengo un bucle

for ( i = 1; i <=NF ; i=i+1 )
{
    "echo" $i | getline var
     printf var " "
}

printf "\n"

de archivo de entrada como

 0 2
 1 2

salidas

 0 0
 0 0

¿qué diablos.

¿Fue útil?

Solución

Bueno, resulta que no es un error.

¿Qué está pasando es el getline abre un nuevo archivo, y dependiendo de la configuración del sistema que sólo puede tener archivos X abiertas por programa. Una vez que abre archivos Sale Max, getline no puede abrir ninguna nueva de fd. La solución es que hay que llamar

for ( i = 1; i <=NF ; i=i+1 )
{
     command="echo" $i
     command | getline var
     close(command)
     printf var " "

}

printf "\n"

Ciertamente, este es un punto sutil y no debe haber enormes señales de advertencia en la documentación acerca de esto! De todas formas, estoy contento de lo resolví.

Otros consejos

He encontrado dos problemas con su muestra. Su "eco" debe ser "eco" (al menos, para mí "eco" no funcionó), y su printf falta el formato de arg.

for ( i = 1; i <=NF ; i=i+1 ) { 
   "echo " $i | getline var; 
   printf "%s ", var ; 
 }

Si desea concatenar los valores

var=$(awk 'BEGIN{cmd="command "}
{
  for (i=1;i<=NF;i++){
     cmd = cmd" "$i
  }
}
END {
  # pass to shell
   print cmd  
}' file)

$var
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top