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

Fat*_*ror 4 awk gawk race-condition

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

$ 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
Run Code Online (Sandbox Code Playgroud)

(作为旁注,我意识到这是一件非常愚蠢的事情awk,但它是我见过它的唯一命令!).

据我了解,这应该将记录分为两个命令 - 按顺序.但由于某种原因,输出看起来相反.如果我这样做

$ echo "a,b,c,d,e,f,g" | awk '{ print $0 | "echo hello"; print $0 | "echo goodbye"; }'
hello
goodbye
Run Code Online (Sandbox Code Playgroud)

然后一切都按照我的预期顺序进行.我认为这必定是某种竞争条件,但我很惊讶awk不等待管道中的子命令完成.这是一个已知的使用问题awk或者是什么问题gawk?有没有办法避免这样的陷阱?

编辑:

我也尝试使用它mawk......相同(反转)的结果,似乎两者都是一致的.

Pau*_*ce. 5

为确保完成外部命令,您必须关闭该命令.

$ 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
Run Code Online (Sandbox Code Playgroud)