次のようなテキストが届きます
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 ずつ減らす方法です。
次のようなテキストが届きます
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 ずつ減らす方法です。
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 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
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