我有一个文本进来
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。
我有一个文本进来
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。
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
我想知道 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
诚然,我可能会使用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