我有大型矩阵文件,只包含" 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 ...
答案 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