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详情请参阅。

相关内容