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