gawkでは、「^バックスラッシュは行の最後の文字ではありません」

gawkでは、「^バックスラッシュは行の最後の文字ではありません」

/各行の間と,内側の数字を一致させ、3ずつ増やしたいと思います。例えば

ユビキタスバックスラッシュ/49、ブラック

~になる

ユビキタスバックスラッシュ/52、ブラック

私のgawkコマンドは次のとおりです。

$ gawk '{b=gensub(/\/([0-9]+),/, "/" (\\1+3) ",") ; print b}' add.jpdf 
gawk: cmd. line:1:                    ^ backslash not last character on line

「^バックスラッシュが最後の文字ではありません」がどういう意味なのか気になります。私の解決策はどのようなgawk構文規則に違反していますか?

ありがとうございます。

ベストアンサー1

gensub()2番目の引数として文字列が必要です。/関数によって評価されると仮定する式の周りに合計を連結しようとしています,(\\1+3)そうではありません。関数を呼び出す前に関数を評価してください。正規表現で\1一致するキャプチャグループを参照できますが、()式ではなく文字列でのみ使用できます。

したがって、せいぜいこれを2番目の引数として使用できますが、"/\\1+3,"結果が得られます...Backslash/49+3,Black。 49+3セクションをこのように評価することはできません。

一致に対して算術演算を実行するには、まず文字列を抽出して操作を実行してから、文字列に戻す必要があります。例えば、

awk '{ n = split($0, d, /\/([0-9]+),/, s)
       print d[1] "/"(substr(s[1],2)+3)"," d[2] }'

これは、gnu awkのsplit()関数と正規表現を使用して行を3つの部分に分割します。つまり、 で一致する前の部分d[1]、 で一致後の部分、d[2]s[1] で一致する文字列です。正確に一致するものが1つあることを確認するには、2であることを確認する必要が"/49,"あります。n

"/"その後、最初の文字列をスキップして算術を実行し、すべての部分を再接続して一致する文字列から数字を抽出できます。


パターンがデータ行に複数回表示される可能性がある場合、より良い解決策はmatch()最後の発生項目のみを見つけ、次を使用して行を切り捨てることですsubstr()

awk '{ match($0, /.*\/([0-9]+),/, m)
       a = m[1,"start"]
       b = m[1,"length"]
       if(a)print substr($0,1,a-1) substr($0,a,b)+3 substr($0,a+b)
       else print }'

ここでは、最後の発生項目のみが一致するようにパターンを.*前に追加しました。正規表現では、キャプチャグループの先頭の文字位置と長さをa設定するため、数値のみが使用されます。最後の行は、元のデータの他の2つの部分で再構築されます。()bsubstr($0,a,b)

おすすめ記事