加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-14 01:22:28 所属栏目:Linux 来源:网络整理
导读:所以,我看到这个输出,我有点惊讶: $echo "a,b,c,d,e,f,g" | cut -d,-f-4a,d$echo "a,-f6-f,gecho "a,g" | awk '{ print $0 | "cut -d,-f-4"; print $0 | "cut -d,-f6-"; }'f,ga,d (作为旁注,我意识到在awk中这是一件非常愚蠢的事情,但这是我见过它的唯一命
所以,我看到这个输出,我有点惊讶:

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

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

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

$echo "a,g" | awk '{ print $0 | "echo hello"; print $0 | "echo goodbye"; }'
hello
goodbye

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

编辑:

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

解决方法

为了确保完成外部命令,您必须执行 close命令.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读