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

オークを使用。最初の問題は複数の区切り文字です。2 つ目は、C 値を取得して 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 regexpがその仕事をするのだろうかと思っていましたが、どうやら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

Perlを使用したAifの回答も、おそらくもう少し好きです。短いほど甘いですね。ただし、GNU awkパターンをキャプチャできます。方法は次のとおりです。

awk 'BEGIN { FS=OFS="." } match($2, /(C)(.*)/, a) { $2 = a[1] a[2] - 2}1' file
于 2012-11-28T12:21:08.107 に答える