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

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

314 から 323 の位置までのフィールドに電話番号があるフラット ファイルがあります。ここで、そのフィールドを でダミー アウトしたいと考えました1234567890

このため、以下のコマンドを使用しようとしましたが、どちらもエラーが発生します。

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

致命的: grow_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 つの部分文字列を印刷する必要があります。1 つはその位置の前の部分、もう 1 つはその位置の後の部分です。次のようになります。

$ 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. gsub() の 3 番目の引数で の$var代わりにを使用すると、gsub() は、その番号が 10 桁の長さのフィールド番号の値であるフィールドを検索するため、awk はそのフィールド #xxxxxxxxxxxx に対して gsub() を試行しますが、これらの非常に膨大な数のフィールドを再評価するためのメモリ割り当てが原因で失敗します (gsub() の 3 番目の引数以外のフィールドを使用すると、awk はフィールドをデフォルトの OFS に再構築するように強制されるため)。varvar$0

  2. 問題 1 を修正すると、var変数内のすべての数字が文字列に置き換えられます1234567890

  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詳細については、を参照してください。

関連情報