我有一個平面文件,其中的字段中包含從位置 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位元組記憶體(無法分配記憶體)
第二種情況
awk 'var=substr($0,314,10) { var = "1234567890" }1' final_phone.txt >final_phone.txt1
這有效,但值沒有改變。輸出保持不變。
有人可以幫我解決這裡的文法嗎?
在第一種情況下,我嘗試將子字串分配給變量,並且gsub()
我想檢查數字模式並替換為1234567890
.
有人可以幫我弄這個嗎
答案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
您的命令有問題:
您正在使用
$var
而不是var
在 gsub() 的第三個參數中,因為它導致 gsub() 查找一個字段,其編號是var
其 10 位長度字段編號的值,因此 awk 嘗試在該字段上使用 gsub() # xxxxxxxxxx 但由於重新評估這些大量欄位的記憶體分配而失敗(因為當使用$0
gsub() 的第三個參數以外的任何欄位時,它會強制 awk 在預設 OFS 上重建欄位)。如果我們解決問題#1,那麼您將
var
用1234567890
字串替換變數中的每個數字。然後,您使用
print
它將列印當前行而不進行任何更改,因為您沒有對此進行任何更新。
答案2
您可以使用它sed
來代替,awk
這樣會更簡潔:
$ sed -E 's/^(.{313})[0-9]{10}/\10123456789/' infile
<313 chars>1234567890
答案3
您可以使用 perl 而不是 awk。例如
perl -p -e 'substr($_,313,10) = "1234567890"' final_phone.txt >final_phone.txt1
注意:在perl的substr
函數中,偏移量從0而不是1開始-所以偏移量313是第314個字元。perldoc -f substr
詳情請參閱。