至于这个命令:
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
$
答案2
也许值得一提的是
sub(/0.00000/,i++)
将替换整行中的第一个匹配项($0,默认值)。偶然的情况下,这也会发生$x
。为了使其故障安全,并为了将来的应用,请将其替换为
sub(/0.00000/,i++, $x)