我不知道为什么我不能只在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
答案 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
。