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

Mar*_*røm 2 perl awk increment

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

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

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

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

0 0 a a a
Run Code Online (Sandbox Code Playgroud)

perl命令给了我:

0 0 1 2 3
Run Code Online (Sandbox Code Playgroud)

虽然我想要

0 0 1 1 1 
Run Code Online (Sandbox Code Playgroud)

以及下一行2 0 2 0 2等等......

这可能与awk有关,但使用:

'{ i=1; gsub(/a/,(i+1));print}' tmp2 
Run Code Online (Sandbox Code Playgroud)

只给我0和2的所有线...

fed*_*qui 5

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

awk '{i++; gsub(/a/,i)}1' file
Run Code Online (Sandbox Code Playgroud)

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

这同样适用于Perl脚本:

perl -pe 'BEGIN { our $i = 0; } $i++; s/a/$i/ge;' file
Run Code Online (Sandbox Code Playgroud)

测试

$ 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
Run Code Online (Sandbox Code Playgroud)