如何理解命令 awk '{for(x=1;x

如何理解命令 awk '{for(x=1;x

至于这个命令:

awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1'

我知道这个命令会在文件中查找“0.00000”,并将其替换为从 1 开始的增量数字。我几乎理解除了 'x<=NF' 和末尾的数字 1 之外的所有内容“{sub(/0.00000/ ,++i)}}1'。请您告诉我这两点吗?

另外,如果我想做同样的事情,但用从 0 开始的增量数字替换匹配项,这样做是否正确:

awk '{for(x=0;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1' file

答案1

NF是一个内部 Awk 变量,其值设置为当前记录中的字段数。所以

for(x=1;x<=NF;x++)

正在循环所有字段。表达式末尾的数字1是打印整个记录的简写方式,当模式评估为“true”时使用默认操作:

在 awk 规则中,可以省略模式或操作,但不能同时省略两者。如果省略该模式,则对每个输入行执行该操作。如果省略该操作,则默认操作是打印与该模式匹配的所有行。1

0要从而不是开始递增数字1,您可以将前缀替换++i为后缀i++

awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,i++)}}1'

前任。

$ echo 'foo 0.00000123 bar' | awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,++i)}}1'
foo 1123 bar

然而

$ echo 'foo 0.00000123 bar' | awk '{for(x=1;x<=NF;x++)if($x~/0.00000/){sub(/0.00000/,i++)}}1'
foo 0123 bar
$

  1. GNU Awk 用户指南:1.3 一些简单示例

答案2

也许值得一提的是

sub(/0.00000/,i++)

将替换整行中的第一个匹配项($0,默认值)。偶然的情况下,这也会发生$x。为了使其故障安全,并为了将来的应用,请将其替换为

sub(/0.00000/,i++, $x)

相关内容