用每行增加的数字替换字符

时间:2015-06-16 11:49:18

标签: perl awk increment

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

perl -pe 'BEGIN { our $i = 1; } s/a/($i++)/ge;'; < FILE > NEW_FILE

但每行只增加一次,而不是每行增加一次。

所以如果我在文件中的第一行是:

0 0 a a a

perl命令给了我:

0 0 1 2 3

虽然我想要

0 0 1 1 1 

并在下一行例如2 0 2 0 2等等......

这应该可以与awk一起使用,但使用:

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

给我所有行的0和2 ...

3 个答案:

答案 0 :(得分:5)

只是增加之前,而不是每次替换:

awk '{i++; gsub(/a/,i)}1' file

这样,变量每行更新一次,而不是每条记录更新一次。

这同样适用于Perl脚本:

perl -pe 'BEGIN { our $i = 0; } $i++; s/a/$i/ge;' file

测试

$ cat a
0 0 a a a
2 3 a a a
$ awk '{i++; gsub(/a/,i)}1' a
0 0 1 1 1
2 3 2 2 2
$ perl -pe 'BEGIN { our $i = 0; } $i++; s/a/$i/ge;' a
0 0 1 1 1
2 3 2 2 2

答案 1 :(得分:3)

您可以使用当前行号

简单地替换a的每一个匹配项
perl -pe 's/a/$./g' FILE > NEW_FILE

答案 2 :(得分:1)

perl -pe'$i++;s/a/$i/g'

或者如果您只想为具有任何替换的行增加

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