首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么(G)会反转这些输出线?

为什么(G)会反转这些输出线?
EN

Stack Overflow用户
提问于 2012-04-25 15:35:16
回答 2查看 193关注 0票数 4

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

代码语言:javascript
复制
$ 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中这样做是完全愚蠢的,但这是我看到的唯一的命令!)。

据我所知,这应该将记录排入两个命令中--按顺序排列。但出于某种原因,产出似乎出现了逆转。如果我这样做

代码语言:javascript
复制
$ echo "a,b,c,d,e,f,g" | awk '{ print $0 | "echo hello"; print $0 | "echo goodbye"; }'
hello
goodbye

然后一切都按我预期的顺序来了。我认为这一定是某种争用条件,但我感到惊讶的是,awk没有等待管道中的子命令完成。这是一个已知的问题,使用awk或某些东西对gawk?有什么办法可以避免这样的陷阱吗?

编辑:

我也试过用mawk ..。相同的(相反的)结果,并且似乎对两者都是一致的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-25 16:08:59

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

代码语言:javascript
复制
$ 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
票数 5
EN

Stack Overflow用户

发布于 2012-04-25 16:09:52

我对此感到惊讶,但很明显,awk并行运行命令。试试这个:

代码语言:javascript
复制
# 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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10318922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档