部分文字列を特定の値に置き換える awk コマンド

部分文字列を特定の値に置き換える awk コマンド

場所314から323までの電話番号を含むフィールドを含むフラットファイルがあります。今私はこの分野を仮想化したいと思います1234567890

これを行うには、次のコマンドを試しましたが、どちらもエラーが発生しました。

awk '{var=substr($0,314,10);gsub("[0-9]","1234567890",$var); print}' final_phone.txt >final_phone.txt1

fatal:Growth_fields_arr:fields_arr:9849885432バイトのメモリを割り当てることができません。 (メモリを割り当てることはできません。)

2番目のケース

awk 'var=substr($0,314,10) { var = "1234567890" }1' final_phone.txt >final_phone.txt1

これは機能しますが、値は変更されません。出力は変更されずに保持されます。

誰かがここで構文を助けることができますか?

最初のケースでは、部分文字列を変数に割り当てようとしていますが、gsub()数値パターンを確認してください1234567890

誰かが私を助けることができますか?

答え1

次のように、その位置の前部とその位置の後ろの2つの部分文字列を印刷する必要があります。

$ awk -v dummy='0123456789' -v start=314 -v len=10 '
{ print substr($0, 1, start-1) dummy substr($0, start+len) }' infile >outfile

テスト:

$ awk -v dummy='0123456789' -v start=4 -v len=10 '
{ print substr($0, 1, start-1) dummy substr($0, start+len) }' <<<'0009876543210999'
0000123456789999

コマンドに問題があります。

  1. $vargsub()の3番目の引数を代わりに使用するvar理由は、gsub()が番号が10ビット長のフィールド番号の値であるフィールドを見つけるようにするためですvar。したがって、awkはそのフィールドでgsub()を使用しようとします。 # xxxxxxxxxx ただし、これらのラージフィールドのメモリ割り当ての再評価は失敗します($0gsub()の3番目の引数以外のフィールドを使用すると、awkがデフォルトのOFSでフィールドを再構築するように強制されるため)。

  2. 問題#1を解決すると、変数のすべての数字が文字列に置き換えられますvar1234567890

  3. printその後、更新しなかったため、これを使用して変更なしで現在の行を印刷します。

答え2

sed代わりに、これをawkより簡潔に使用できます。

$ sed -E 's/^(.{313})[0-9]{10}/\10123456789/' infile
<313 chars>1234567890

答え3

awkの代わりにPerlを使用できます。例えば

perl -p -e 'substr($_,313,10) = "1234567890"' final_phone.txt >final_phone.txt1

注:Perlのsubstr関数では、オフセットは1ではなく0から始まります。したがって、オフセット313は314番目の文字です。perldoc -f substr詳細より。

関連情報