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
コマンドに関する問題:
gsub() の 3 番目の引数で の
$var
代わりにを使用すると、gsub() は、その番号が 10 桁の長さのフィールド番号の値であるフィールドを検索するため、awk はそのフィールド #xxxxxxxxxxxx に対して gsub() を試行しますが、これらの非常に膨大な数のフィールドを再評価するためのメモリ割り当てが原因で失敗します (gsub() の 3 番目の引数以外のフィールドを使用すると、awk はフィールドをデフォルトの OFS に再構築するように強制されるため)。var
var
$0
問題 1 を修正すると、
var
変数内のすべての数字が文字列に置き換えられます1234567890
。その後、
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
詳細については、を参照してください。