separador print examples comando campos cadena buscar awk gawk

print - awk separador de campos



¿Cómo puedo verificar si un proceso abierto de GNU awk está abierto o forzarlo a abrir sin escribir en él? (1)

Tengo un programa de gawk que usa un coproceso. Sin embargo, a veces no tengo datos para escribir en el coproceso, y mi script original se cuelga mientras espera la salida del coproceso.

El siguiente código lee de STDIN, escribe cada línea en un programa "cat", ejecutándose como un coproceso. Luego lee la salida del coproceso y la escribe en STDOUT. Si cambiamos la condición if para que sea 1 == 0, no se escribe nada en el coproceso, y el programa se cuelga en el ciclo while.

Del manual , parece que el coproceso y los canales de comunicación bidireccionales solo se inician la primera vez que hay una operación IO con el operador | &. Tal vez podemos comenzar cosas sin escribir nada (por ejemplo, escribir una cadena vacía)? ¿O hay una forma de comprobar si alguna vez comenzó el coproceso?

#!/usr/bin/awk -f BEGIN { cmd = "cat" ## print "" |& cmd } { if (1 == 1) { print |& cmd } } END { close (cmd, "to") while ((cmd |& getline line)>0) { print line } close(cmd) }


Gran pregunta, +1 por eso!

Simplemente pruebe el código de retorno del close(cmd, "to") - será cero si el conducto estuviera abierto, -1 (o algún otro valor) de lo contrario. p.ej:

if (close(cmd, "to") == 0) { while ((cmd |& getline line)>0) { print line } close(cmd) }