awk - 为什么 (g)awk 反转这些输出行?

标签 awk race-condition gawk

所以,我看到这个输出,我有点惊讶:

$ echo "a,b,c,d,e,f,g" | cut -d, -f-4
a,b,c,d
$ echo "a,b,c,d,e,f,g" | cut -d, -f6-
f,g
echo "a,b,c,d,e,f,g" | awk '{ print $0 | "cut -d, -f-4"; print $0 | "cut -d, -f6-"; }'
f,g
a,b,c,d

(作为旁注,我意识到在 awk 中这样做是一件非常愚蠢的事情,但这是我见过的唯一一个命令!)。

据我了解,这应该将记录按顺序传递给两个命令。但由于某种原因,输出似乎相反。如果我这样做
$ echo "a,b,c,d,e,f,g" | awk '{ print $0 | "echo hello"; print $0 | "echo goodbye"; }'
hello
goodbye

然后一切都按照我预期的顺序进行。我想这一定是某种竞争条件,但我很惊讶 awk不等待管道中的子命令完成。这是使用 awk 的已知问题吗?或一些特殊的东西 gawk ?有没有办法避免这样的陷阱?

编辑:

我尝试使用 mawk太......相同(相反)的结果,并且似乎对两者都发生一致。

最佳答案

为了确保外部命令完成,您必须close命令。

$ echo "a,b,c,d,e,f,g" | awk 'BEGIN {cmd1 = "cut -d, -f-4"; cmd2 = "cut -d, -f6-"} { print $0 | cmd1; close(cmd1); print $0 | cmd2; close(cmd2)}'
a,b,c,d
f,g

关于awk - 为什么 (g)awk 反转这些输出行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10318922/

相关文章:

bash - 如何grep文件中不区分大小写的字符串?

bash - 如果前一行是前缀,则删除行(从输出中省略)

rabbitmq - AMQP/RabbitMQ - 如何避免竞争条件

javascript - 为什么将我的 JavaScript 库包装在一个匿名函数中可以修复我的竞态条件?

Verilog:以下代码会产生竞争条件吗?

awk - 用 OFS 分隔的 AWK 打印所有字段

bash - 使用 awk 的最近邻居

bash - 使用 AWK 的最小-最大规范化

arrays - 使用 awk 在 bash 中使用另一个有序数组模式对多行数组进行排序

与split相反