awk仅忽略0行

时间:2017-05-16 21:13:19

标签: bash awk

我不知道为什么我不能只在0中直接声明awk,例如如果我想输出数字的平方:

$ echo 4 | awk '$0=$1*$1'
16

$ echo 3 | awk '$0=$1*$1'
9

$ echo 0 | awk '$0=$1*$1'

为什么我在最后一次尝试中什么也得不到?

PS。如果我用括号内的语句写$1,它就有效:

$ echo 0 | awk '{print $1*$1}'
0

1 个答案:

答案 0 :(得分:3)

不,awk不会忽略0行。

但是,您的awk命令:$0=$1*$1没有按照您的想法执行。

默认情况下,如果存在一个计算结果为true(非零)的语句,awk将打印$ 0。

所以,这将始终打印$ 0:

awk '1'

这永远不会打印$ 0:

awk '0'

要做你想做的事:在重新计算后总是打印$ 0,你需要这样做:

awk '{$0=$1*$1; print}'

所以:

$ echo "0" | awk '{$0=$1*$1; print}'
0

$ echo "2" | awk '{$0=$1*$1; print}'
4

或者,在不更改$ 0的值的情况下,执行:

$ echo "2" | awk '{print $0*$0}'

或(更短但不太可读):

$ echo "2" | awk '{$0=$0*$0}1'
4

而且,甚至更短:

$ echo "4" | awk '{$0*=$0}1'
16

这个最后一个awk脚本实际上由两个命令行组成:

awk '
     <default pattern> {      $0*=$0      }
             1         { <default action> }
    '

这将成为,通过印刷和所有条件取代行动:

awk ' /.*/{$0*=$0}
       1  {print $0}'

两条线都应用于所有输入线。对于所有行$0都已更改,并且对于所有输入行,都会执行print $0