Perl 用每行递增的数字替换字符

Perl 用每行递增的数字替换字符,perl,awk,increment,Perl,Awk,Increment,我在clolumns中有只包含“0”和“a”的大型矩阵文件,我想这样做: perl -pe 'BEGIN { our $i = 1; } s/a/($i++)/ge;'; < FILE > NEW_FILE perl命令为我提供了: 0 0 1 2 3 当我想要的时候 0 0 1 1 1 在下一行,例如2202等等 这应该可以通过awk实现,但使用: '{ i=1; gsub(/a/,(i+1));print}' tmp2 只要给我0和2的所有线 仅在之前增加,而不是每次

我在clolumns中有只包含“0”和“a”的大型矩阵文件,我想这样做:

perl -pe 'BEGIN { our $i = 1; } s/a/($i++)/ge;'; < FILE > NEW_FILE
perl命令为我提供了:

0 0 1 2 3
当我想要的时候

0 0 1 1 1 
在下一行,例如
2202
等等

这应该可以通过awk实现,但使用:

'{ i=1; gsub(/a/,(i+1));print}' tmp2 

只要给我0和2的所有线

仅在之前增加,而不是每次替换时增加:

awk '{i++; gsub(/a/,i)}1' file
这样,变量每行更新一次,而不是每记录更新一次

这同样适用于Perl脚本:

perl -pe 'BEGIN { our $i = 0; } $i++; s/a/$i/ge;' file
试验 或者,如果您只想为具有任何替换的行递增

perl -pe'/a/&&$i++;s/a/$i/g'
在行动中:

$ cat a
0 0 a a a
1 2 0 0 0
2 3 a a a
$ perl -pe'$i++;s/a/$i/g' a
0 0 1 1 1
1 2 0 0 0
2 3 3 3 3
$ perl -pe'/a/&&$i++;s/a/$i/g' a
0 0 1 1 1
1 2 0 0 0
2 3 2 2 2

您只需用当前行号替换出现的
a

perl -pe 's/a/$./g' FILE > NEW_FILE

完美的非常感谢!您只需使用
i
一次
'{gsub(/a/,++i)}1'
perl -pe'/a/&&$i++;s/a/$i/g'
$ cat a
0 0 a a a
1 2 0 0 0
2 3 a a a
$ perl -pe'$i++;s/a/$i/g' a
0 0 1 1 1
1 2 0 0 0
2 3 3 3 3
$ perl -pe'/a/&&$i++;s/a/$i/g' a
0 0 1 1 1
1 2 0 0 0
2 3 2 2 2
perl -pe 's/a/$./g' FILE > NEW_FILE