修改文本中的数字值

时间:2012-11-28 11:39:03

标签: awk

我有一个文字

A1:B2.C3.D4.E5
A2:B7.C10.D0.E9
A0:B1.C9.D4.E8

我想知道如何改变它

A1:B2.C1.D4.E5
A2:B7.C8.D0.E9
A0:B1.C7.D4.E8

使用Awk。第一个问题是多个分隔符。第二,如何得到C值和递减2。

3 个答案:

答案 0 :(得分:2)

awk解决方案:

$ awk -F"." '{$2=substr($2,0,1)""substr($2,2)-2;}1' OFS="." file
A1:B2.C1.D4.E5
A2:B7.C8.D0.E9
A0:B1.C7.D4.E8

答案 1 :(得分:1)

我想知道awk正则表达式是否可以完成这项任务,但显然,awk无法捕获模式。这就是我建议perl解决方案的原因:

$ cat data.txt 
A1:B2.C3.D4.E5
A2:B7.C10.D0.E9
A0:B1.C9.D4.E8
$ perl -pe 's/C([0-9]+)/"C" . ($1-2)/ge;' data.txt
A1:B2.C1.D4.E5
A2:B7.C8.D0.E9
A0:B1.C7.D4.E8

答案 2 :(得分:1)

不可否认,我可能会使用像Guru所示的substr()函数来完成此操作:

awk 'BEGIN { FS=OFS="." } { $2 = substr($2,0,1) substr($2,2) - 2 }1' file

我也喜欢Aif使用Perl的答案可能只是一点点。越短越甜,不是吗?但是,GNU awk可以捕获图案。方法如下:

awk 'BEGIN { FS=OFS="." } match($2, /(C)(.*)/, a) { $2 = a[1] a[2] - 2}1' file