У меня есть плоский файл, в котором есть номер телефона в поле, начинающееся с позиции 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
schrodigerscatcuriosity 22 Окт 2021 в 19:22
2
Пожалуйста, отредактируйте свой вопрос и добавьте i) пример входного файла и ii) результат, который вы хотите получить из этого файла. Очень трудно помочь вам разобрать данные, если вы не покажете нам, что мы должны анализировать.
 – 
terdon
22 Окт 2021 в 19:08
1
Вопрос и ответ на stackoverflow.com/q/69678703/1745001 за час до того, как вы задали тот же вопрос здесь. Пожалуйста, не размещайте несколько постов и, пожалуйста, читайте ответы, которые вы получаете на любом форуме, где вы задаете вопросы.
 – 
Ed Morton
23 Окт 2021 в 02:11

3 ответа

Лучший ответ

Вам нужно напечатать две подстроки, одну часть до этой позиции и другую часть после этой позиции, что-то вроде:

$ 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, он напечатает текущую строку без изменений, так как вы не делаете никаких обновлений для нее.

5
αғsнιη 22 Окт 2021 в 19:22
Я попробовал приведенные выше команды, которые вы предоставили. В обоих случаях подстрока не изменилась
 – 
Nikhil
22 Окт 2021 в 19:04
Я перенаправил на новый файл, но не повезло
 – 
Nikhil
22 Окт 2021 в 19:08
Awk -v dummy='1234567890' -v start=314-v len=10 ' { print substr($0, 1, start-1) dummy substr($0, start+len) }' final_phone.txt >final_phone1.txt
 – 
Nikhil
22 Окт 2021 в 19:10
Вы просто скопировали и вставили из ответа? почему пробел после 314 перед -v удален? а затем убедитесь, что ваш файл в текстовом файле Linux с новой строкой, заканчивающейся не окнами, как с CRLF, если это окна, вам нужно сначала выполнить dos2unix в вашем файле
 – 
αғsнιη
22 Окт 2021 в 19:12
1
См. unix.stackexchange.com/questions/674384/… и примите меры. Тогда я не понимаю, как это не работает. тогда мы не видим ожидаемого вами результата, но мой данный ответ основан на том, что вы описали и пытаетесь сделать.
 – 
αғsнιη
22 Окт 2021 в 19:52

Вы можете использовать sed вместо awk, что будет менее подробным:

$ sed -E 's/^(.{313})[0-9]{10}/\10123456789/' infile
<313 chars>1234567890
1
schrodigerscatcuriosity 22 Окт 2021 в 19:05
Я пробовал это, но это полностью изменило формат файла
 – 
Nikhil
22 Окт 2021 в 20:01
1
Пожалуйста, отредактируйте вопрос, добавив что здесь спрашивают
 – 
schrodigerscatcuriosity
22 Окт 2021 в 20:45

Вы можете использовать perl вместо awk. например

perl -p -e 'substr($_,313,10) = "1234567890"' final_phone.txt >final_phone.txt1

ПРИМЕЧАНИЕ: в функции perl substr смещения начинаются с 0 вместо 1, поэтому смещение 313 является 314-м символом. Подробнее см. perldoc -f substr.

0
cas 23 Окт 2021 в 04:22