awk pipe input e output de um cmd de shell

1

Eu quero executar um comando shell no awk. Comandos shell frequentemente pegam stdin e escrevem para stdout.

print to_sort | "sort"
"sort" | getline

não está funcionando (o tipo na segunda linha aguarda a entrada)

print to_sort | "sort" | getline

é um erro de sintaxe.

    
por Adam 03.06.2018 / 22:57

1 resposta

2

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 }'
    
por 03.06.2018 / 23:19

Tags