正規表現を区切り文字として使用するときに正しい区切り文字を再印刷する方法は?

正規表現を区切り文字として使用するときに正しい区切り文字を再印刷する方法は?

私の行は次のとおりです

123-456-789 12.34.56 example

12を選択して2を追加してから、行全体をそのまま印刷したいと思います。したがって、結果は次のようになります。

123-456-789 14.34.56 example

私は次のような奇妙な表現を持っています。

awk 'BEGIN {FS="[ .]"}{$2=$2+2}{print}'

しかしそれは私に与えた

123-456-789 14 34 56 example

ドットが消えてスペースに置き換えられました。

答え1

awk '{ split($2,a,"\."); a[1]+=2; $2=sprintf("%d.%d.%d", a[1],a[2],a[3]) } 1' file

または、

awk '{ split($2,a,"\."); $2=sprintf("%d.%d.%d", a[1] + 2,a[2],a[3]) } 1' file

行をスペースで区切られたフィールドのセットとして読み込みます。 2番目のフィールドをポイントに分割し、結果の最初の部分に2を追加します。次に、結果レコードを印刷する前に、2番目のフィールドをドットで区切られた3つの整数に再フォーマットします(印刷は1ショートカットの終わりにある項目によって実行されます{ print })。

これは、2番目のレコードが実際に3つの点で区切られた整数であることを知っていると仮定します。

何が起こっているのか、非常に明確で理解しメンテナンスしやすいので、こうすることです。

答え2

しようとする」また覆う複合/複合フィールド区切り文字は、特定の値とレコード全体の一貫性を破ることができます。
代わりに、次のアプローチを使用してください。

awk '{ n = substr($2, 1, index($2, ".")); sub(/[^.]+\./, n + 2 ".", $2) }1' file

出力:

123-456-789 14.34.56 example

上記のコマンドは、スペースをデフォルトのフィールド区切り文字として使用し、$22番目のフィールドでのみ必要なすべての処理を実行します。

答え3

フィールド区切り文字の取得を許可する関数をスクリプトで使用しますsplitawk

 awk '{split($0,a,"[- .]",sep); a[4]+=2; for(i in a) printf "%s%s",a[i], sep[i]; printf "\n"}' file

RSまたは、RT変数を使用できます。

 awk -v RS='[- .]' 'NR==4{$1+=2} {printf "%s%s",$0,RT}' file <<< '123-456-789 12.34.56 example'

最後は1行でのみ機能します。

答え4

ジェンソブのバカと

gawk '{sub(/[^.]*/,gensub(/([^.]*).*/,"\\1",1,$2)+2,$2)}1' infile

関連情報