O GNU awk conhece os coprocessos que podem fazer isso . O manual também descreve por que o que você está fazendo não funciona: os dois comandos usados no pipe são subprocessos distintos, apesar de terem sido iniciados com a mesma linha de comando. Para obter entrada e saída para e do mesmo subprocesso, use |&
em ambos os canais:
awk 'BEGIN {com = "cat -n"} {print |& com; com |& getline; print}'
Isso realmente não ajuda você com sort
, já que sort
não produz qualquer saída até ver um EOF em sua entrada.
Com comandos como esse, você precisa fornecer toda a saída primeiro, fechar a extremidade de gravação do pipe do coprocess e somente então começar a ler a partir dele. Por exemplo,
awk 'BEGIN {com="sort"} {print |& com} END { print "---"; close(com, "to"); while(com |& getline) print }'