我想在 awk 中运行 shell 命令。 Shell 命令通常采用 stdin 并写入 stdout。
print to_sort | "sort"
"sort" | getline
不起作用(在第二行排序等待输入)
print to_sort | "sort" | getline
是一个语法错误。
答案1
GNU awk 知道协进程可以做到这一点。它的手册还描述了为什么您正在做的事情不起作用:管道中使用的两个命令是不同的子进程,即使它们是使用相同的命令行启动的。要从同一子进程获取输入和输出,请|&
在两个管道上使用:
awk 'BEGIN {com = "cat -n"} {print |& com; com |& getline; print}'
但这并不能真正帮助你sort
,因为sort
不会产生任何输出,直到在输入中看到 EOF。
对于这样的命令,您需要首先给出所有输出,关闭协进程管道的写入端,然后才开始从中读取。例如
awk 'BEGIN {com="sort"} {print |& com} END { print "---"; close(com, "to"); while(com |& getline) print }'