Cómo utilizar getline en AWK con un comando que se concatenan
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.
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