1

我有一个文本进来

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-Value 和 Decrement 2。

4

3 回答 3

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
于 2012-11-28T11:56:27.600 回答
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
于 2012-11-28T12:02:57.843 回答
1

诚然,我可能会使用substr()Guru 显示的功能来完成此操作:

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
于 2012-11-28T12:21:08.107 回答