据我了解,$1
是第一个领域。但奇怪的是,awk '$1=$1'
省略了额外的空格。
$ echo "$string"
foo foo bar bar
$ echo "$string" | awk '$1=$1'
foo foo bar bar
为什么会这样?
据我了解,$1
是第一个领域。但奇怪的是,awk '$1=$1'
省略了额外的空格。
$ echo "$string"
foo foo bar bar
$ echo "$string" | awk '$1=$1'
foo foo bar bar
为什么会这样?
当我们为字段变量赋值时,即。$1 的值分配给字段 $1,awk 实际上通过将它们与默认字段分隔符(或 OFS)空间连接来重建其 $0。
我们也可以在以下场景中得到相同的情况......
对于 GNU AWK,此行为记录在此处:
https ://www.gnu.org/software/gawk/manual/html_node/Changing-Fields.html
导致 AWK 评估
$1=$1
,将字段分配给自身,并具有重新评估的副作用$0
;然后 AWK 考虑表达式的值,因为它非零且非空,所以它执行默认操作,即打印$0
。当 AWK 重新评估时,多余的空格会被删除
$0
:它通过使用OFS
作为分隔符连接所有字段来做到这一点,默认情况下这是一个空格。当 AWK 解析记录时$0
,按原样包含整个记录,并$1
包含$NF
字段,不包含分隔符;当任何字段被分配到时,$0
从字段值中重建。此示例中 AWK 是否输出任何内容取决于输入:
不会输出任何东西。
$1=$1
评估第一个字段中的任何内容,0
在这种情况下;这是 AWK 中的“错误”结果,因此没有任何反应,也没有任何输出。为避免这种情况,$1=$1
请转换为操作并让 AWK 在所有情况下都打印当前记录:1
导致 AWK 始终运行默认操作。