所以,我看到了这个输出,我有点惊讶:
$ 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
...相同(反转)的结果,似乎两者都是一致的。
答案 0 :(得分:5)
为了确保完成外部命令,您必须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
答案 1 :(得分:4)
我对此感到惊讶,但很明显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