我开始学习awk并遇到一些当我运行以下命令时
$ echo ":a:b:c:" | awk '$1=$1' FS=":" OFS="$"
$ echo "a:b:c:" | awk '$1=$1' FS=":" OFS="$"
a$b$c$
Run Code Online (Sandbox Code Playgroud)
第一个命令不返回任何内容,但我预计它会返回$a$b$c$,类似于第二个命令。通常,当字段分隔符位于行首时,它永远不会打印任何内容。为什么这样?
在您的awk脚本中,打印是作为默认操作触发的,而这又取决于$1=$1作为模式的分配的“副作用”评估。
在第一种情况下,第一个分隔符之前有一个空字段,$1空字符串也是如此,其计算结果为 FALSE。在第二种情况下,$1是非空 string a,其计算结果为 TRUE,触发默认打印操作。
您依靠第一个字段的真值来使 awk 打印记录。空字符串的真值是假的,所以 awk 除了赋值之外不做任何事情。显式打印(或使用其他一些始终为真的条件,例如1),而不是使用第一个字段作为检查:
echo ":a:b:c:" | awk '{$1=$1; print}' FS=":" OFS="$"
Run Code Online (Sandbox Code Playgroud)
-vor或 赋值,您可以从中访问(请参阅/sf/ask/1335297001/)。BEGINENVIRON[]所以你的脚本应该是awk -F':' -v OFS='$' '{$1=$1}1'.