为什么 awk 不打印任何值?

sh.*_*.ll 3 awk

我开始学习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$,类似于第二个命令。通常,当字段分隔符位于行首时,它永远不会打印任何内容。为什么这样?

ste*_*ver 8

在您的awk脚本中,打印是作为默认操作触发的,而这又取决于$1=$1作为模式的分配的“副作用”评估。

在第一种情况下,第一个分隔符之前有一个空字段,$1空字符串也是如此,其计算结果为 FALSE。在第二种情况下,$1是非空 string a,其计算结果为 TRUE,触发默认打印操作。


mur*_*uru 5

您依靠第一个字段的真值来使 awk 打印记录。空字符串的真值是假的,所以 awk 除了赋值之外不做任何事情。显式打印(或使用其他一些始终为真的条件,例如1),而不是使用第一个字段作为检查:

echo ":a:b:c:" | awk '{$1=$1; print}' FS=":" OFS="$"
Run Code Online (Sandbox Code Playgroud)


Ed *_*ton 5

  1. 不要让操作的结果评估为条件,除非您有非常具体的需求(例如,您尝试删除存在的字符,并希望在成功时执行某些操作)。
  2. 当您在看到使用变量的代码之前看到变量被设置时,代码更具可读性,因此不要在脚本之后的文件列表中列出变量分配,除非您有非常具体的需求(例如在文件之间更改值),请将它们列出来在调用 awk 之前 使用-vor或 赋值,您可以从中访问(请参阅/sf/ask/1335297001/)。BEGINENVIRON[]
  3. 除非您非常具体需要使用双引号或不使用引号,否则请在 shell 中的所有字符串(包括脚本)周围使用单引号(请参阅https://mywiki.wooledge.org/Quotes)。

所以你的脚本应该是awk -F':' -v OFS='$' '{$1=$1}1'.