Perl 用每行递增的数字替换字符
我在clolumns中有只包含“0”和“a”的大型矩阵文件,我想这样做: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的所有线 仅在之前增加,而不是每次
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