gawk の変数を間隔式の繰り返し間隔値として使用する

gawk の変数を間隔式の繰り返し間隔値として使用する

OSディストリビューション:Ubuntu 22.04.3 LTS
gawkバージョン:GNU Awk 5.1.0、API:3.0(GNU MPFR 4.1.0、GNU MP 6.2.1)

テキストファイルがあり、たまに1行にAが表示されます。目立つ量のスペースとランダムなテキストが続きます。私はgawkを使ってこの行を検索し、行の左側を修正しています。

入力する:

formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
                                                                           random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
                                                                           random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text

予想出力:

formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
                WORDWRAP                                                   random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
                WORDWRAP                                                   random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text

このコマンドは機能し、予想される出力を返します。

gawk '/^[[:space:]]{75}/ { $0 = substr($0,1,15) " WORDWRAP " substr($0,26) }1' input.txt

私がしたいのは、間隔式の繰り返し間隔とsubstr関数の開始長さの値に変数を割り当てることです。これは、入力ファイルによって変更される可能性があるためです。

3つの環境変数を設定しました。

export PH1="75"; export PH2="15"; export PH3="26"

次に、次のコマンドを実行してみます。

gawk -v gph1="${PH1}" -v gph2="${PH2}" -v gph3="${PH3}" '/^[[:space:]]{gph1}/ { $0 = substr($0,1,gph2) " WORDWRAP " substr($0,gph3) }1' input.txt

変更されていない入力のみを返します。繰り返し間隔を実際の値に設定し、substrの開始値と長さの値に変数を保持する場合:

gawk -v gph2="${PH2}" -v gph3="${PH3}" '/^[[:space:]]{75}/ { $0 = substr($0,1,gph2) " WORDWRAP " substr($0,gph3) }1' input.txt

動作し、期待される出力を返します。
私も変更されていない入力を返すので、成功せず、これを試しました。

gawk '/^[[:space:]]{ENVIRON["PH1"]}/ { $0 = substr($0,1,ENVIRON["PH2"]) " WORDWRAP " substr($0,ENVIRON["PH3"]) }1' input.txt

ただし、これは反復間隔を実際の値に設定すると機能します。

gawk '/^[[:space:]]{75}/ { $0 = substr($0,1,ENVIRON["PH2"]) " WORDWRAP " substr($0,ENVIRON["PH3"]) }1' input.txt

間隔式で変数を繰り返し間隔として使用する方法はありますか?

(2023-09-30追加)この質問に対する答えは「はい」ですが、正規表現定数にはありません。受け取ったフィードバックに基づいて、コマンドを次のように変更しました。

gawk -v gph1="${PH1}" -v gph2="${PH2}" -v gph3="${PH3}" ' $0 ~ "^[[:blank:]]{" gph1 "}" { $0 = substr($0,1,gph2) " WORDWRAP " substr($0,gph3) }1' input.txt

ベストアンサー1

BEGIN{...}ブロックに必要な正規表現を作成できます。たとえば、次のようになります。

BEGIN { regex = "^[[:space:]]{" gph1 "}" }

次に、基本スクリプトは$0入力行()を正規表現と比較します。たとえば、次のようになります。

# replace this:

/^[[:space:]]{gph1}/

# with this:

$0 ~ regex

次の変更を現在のgawkスクリプトに適用します。

gawk -v gph1="${PH1}" -v gph2="${PH2}" -v gph3="${PH3}" '
BEGIN      { regex = "^[[:space:]]{" gph1 "}" }
$0 ~ regex { $0 = substr($0,1,gph2) " WORDWRAP " substr($0,gph3) }
1
' input.txt

これで以下が生成されます。

formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
                WORDWRAP                                                   random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text
                WORDWRAP                                                   random_text
formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text formatted_text

おすすめ記事