У меня есть файл, в котором в поле с позиции 314 по 323 указан номер телефона. Теперь я хочу замаскировать это поле с помощью 1234567890
.
Для этого я попробовал использовать следующие команды, и обе выдают ошибку:
awk '{var=substr($0,314,10);gsub("[0-9]","1234567890",$var); print}' final_phone.txt >final_phone.txt1
fatal: 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
Подробности см.