Как заменить строку на другую в строке с номером 3 (n) и каждые n 6 (например, 9, 15, 24 и так далее) в Linux с помощью sed или awk или любых других программ?

#linux #awk #sed

#linux #awk #sed

Вопрос:

Я собрал очень большие данные в .txt файле, содержащем около 6 тысяч строк, и я хочу сначала изменить строку 3, которая вызывается сейчас n , и каждую n 6 строку, например 9, 15, 24 и так далее.

Это пример текущего состояния:

 domain_name = {'name': 'aaa.pro'
'register': 159.00
'register': 159.00
'register': 159.00
'currency': USD

domain_name = {'name': 'abogado'
'register': 40.50
'register': 40.50
'register': 40.50
'currency': USD

domain_name = {'name': 'academy'
'register': 34.50
'register': 34.50
'register': 34.50
'currency': USD
  

Я хочу, чтобы результат был примерно таким:

 domain_name = {'name': 'aaa.pro'
'register': 159.00
'renew': 159.00
'register': 159.00
'currency': USD

domain_name = {'name': 'abogado'
'register': 40.50
'renew': 40.50
'register': 40.50
'currency': USD

domain_name = {'name': 'academy'
'register': 34.50
'renew': 34.50
'register': 34.50
'currency': USD
  

Так что строка с номером 3 n , а затем строки с номерами 9, 15 и так далее (n 6), содержащие register строку, должны быть заменены на renew string .

Я прочитал sed и awk руководство, но я не понял, как именно этого достичь.

Не могли бы вы мне помочь?

Ответ №1:

Не могли бы вы попробовать следовать.

 awk -v n="3" 'FNR==n{sub(/register/,"renew");n =6} 1' Input_file
  

Объяснение: упоминание -v n="3" о создании переменной с именем n , которая имеет значение as 3 . Затем проверьте условие FNR==n , чтобы увидеть, совпадает ли текущий номер строки с тем, что n затем перейдите внутрь блока {...} и используйте sub регистр замены с обновлением там, затем добавьте 6 к текущему значению n и сохраните его в n себе. 1 будет напечатана текущая строка.

Ответ №2:

Это может сработать для вас (GNU sed):

 sed -i '3~6s/register/renew/' file
  

Начиная со строки 3 и каждые 6 строк после этого замените renew register и отредактируйте файл на месте.