我有一个平面文件,其中的字段中包含从位置 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
详情请参阅。