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

为什么(g)awk会反转这些输出线?,awk,race-condition,gawk,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" | 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
试过了。。。相同(相反)的结果,并且两种情况似乎都是一致的。

为了确保外部命令完成,必须执行该命令

$ 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并行运行命令。试试这个:

# time echo "a,b,c,d,e,f,g" | awk '{ print $0 | "sleep 2"; print $0 | "sleep 2"; }'

real    0m2.250s
user    0m0.030s
sys     0m0.060s

通过使用
date
测试,我得到了两种顺序的输出<代码>回显“a、b、c、d、e、f、g”| awk'{打印$0 |“日期\”+a%s.%N\”;打印$0 |“日期\”+b%s.%N\”}