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位元組記憶體(無法分配記憶體)

第二種情況

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

您的命令有問題:

  1. 您正在使用$var而不是var在 gsub() 的第三個參數中,因為它導致 gsub() 查找一個字段,其編號是var其 10 位長度字段編號的值,因此 awk 嘗試在該字段上使用 gsub() # xxxxxxxxxx 但由於重新評估這些大量欄位的記憶體分配而失敗(因為當使用$0gsub() 的第三個參數以外的任何欄位時,它會強制 awk 在預設 OFS 上重建欄位)。

  2. 如果我們解決問題#1,那麼您將var1234567890字串替換變數中的每個數字。

  3. 然後,您使用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詳情請參閱。

相關內容