Команда Awk для замены подстроки определенным значением

Команда Awk для замены подстроки определенным значением

У меня есть файл, в котором в поле с позиции 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

Проблема с вашей командой:

  1. вы используете $varвместо этого varв третьем аргументе gsub(), поскольку в результате gsub() ищет поле, номер которого является значением , varэто номер поля длиной 10 цифр, поэтому awk пытается выполнить gsub() для этого поля #xxxxxxxxxx, но это не удается из-за выделения памяти для повторной оценки этого очень большого количества полей (потому что при использовании любого поля, отличного от $0третьего аргумента gsub(), это заставляет awk перестраивать поля обратно на OFS по умолчанию).

  2. Если мы исправим проблему №1, то вам придется заменить каждую отдельную цифру в varпеременной на 1234567890строку.

  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Подробности см.

Связанный контент