awk 命令用特定值替换子字符串

Nik*_*hil 0 awk

我有一个平面文件,其中的字段中包含从位置 314 到 323 的电话号码。现在我想用 来虚拟该字段1234567890

为此,我尝试使用以下命令,但都抛出错误:

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

致命:grow_fields_arr:fields_arr:无法分配9849885432字节内存(无法分配内存)

第二种情况

awk 'var=substr($0,314,10) { var = "1234567890" }1' final_phone.txt >final_phone.txt1
Run Code Online (Sandbox Code Playgroud)

这有效,但值没有改变。输出保持不变。

有人可以帮我解决这里的语法吗?

在第一种情况下,我尝试将子字符串分配给变量,并且gsub()我想检查数字模式并替换为1234567890.

有人可以帮我弄这个吗

αғs*_*нιη 6

您需要打印两个子字符串,一部分在该位置之前,另一部分在该位置之后,类似于:

$ awk -v dummy='0123456789' -v start=314 -v len=10 '
{ print substr($0, 1, start-1) dummy substr($0, start+len) }' infile >outfile
Run Code Online (Sandbox Code Playgroud)

测试:

$ awk -v dummy='0123456789' -v start=4 -v len=10 '
{ print substr($0, 1, start-1) dummy substr($0, start+len) }' <<<'0009876543210999'
0000123456789999
Run Code Online (Sandbox Code Playgroud)

您的命令有问题:

  1. 您正在使用$var而不是var在 gsub() 的第三个参数中,因为它导致 gsub() 查找一个字段,其编号是var其 10 位长度字段编号的值,因此 awk 尝试在该字段上使用 gsub() #xxxxxxxxxx 但由于重新评估这些大量字段的内存分配而失败(因为当使用$0gsub() 的第三个参数以外的任何字段时,它会强制 awk 在默认 OFS 上重建字段)。

  2. 如果我们解决问题#1,那么您将var1234567890字符串替换变量中的每个数字。

  3. 然后,您使用print它将打印当前行而不进行任何更改,因为您没有对此进行任何更新。