awk/sed в цикле для замены чисел (с результатом вычисления)

Вопрос или проблема

Я относительно новичок в awk и sed. 
У меня есть файл с более чем 30000 строк; например,

Прямая конфигурация= 5 
0.86331344 0.14835363 0.01770155
0.83813858 0.74789354 0.31772038
0.89805721 0.04407727 0.09535924
0.01960635 0.13639495 0.08503445
0.60042328 0.54392927 0.30715808
0.89205404 0.17572676 0.17279700
            ︙
        (до 135 строк числовых данных в трех колонках)
            ︙
Прямая конфигурация= 10 
0.86331344 0.14835363 0.01770155 
0.83813858 0.74789354 0.31772038 
0.89805721 0.04407727 0.09535924 ........... 

Я хочу добавить конкретное число, скажем 1000,
ко всем числовым терминам после Прямая конфигурация=
Более конкретно, мне нужно заменить каждый числовой термин
после Прямая конфигурация= на сумму термина + 1000,
но оставить остальную часть файла без изменений. 
Есть ли какой-нибудь bash/awk/sed/python скрипт, чтобы сделать это в цикле?

P.S. Строка Прямая конфигурация= встречается после каждых 135 строк,
т.е. в строках 1, 137, 272 и так далее.

Если вам нужно увеличить цифру после совпадающей строки:

С помощью awk, который позволяет выполнять арифметику по замыслу:

awk -v val=1000 '/Прямая конфигурация/{$NF+=val}1' файл
Прямая конфигурация= 1005
0.86331344 0.14835363 0.01770155
0.83813858 0.74789354 0.31772038
0.89805721 0.04407727 0.09535924
0.01960635 0.13639495 0.08503445
0.60042328 0.54392927 0.30715808
0.89205404 0.17572676 0.17279700

Вы можете заменить val=5 на то, что ожидаете, например, val=1000.


что-делает-число-после-скобок

Используя любой awk:

$ awk 'BEGIN{FS=OFS="= "} NF>1{$2+=1000} 1' файл
Прямая конфигурация= 1005
0.86331344 0.14835363 0.01770155
0.83813858 0.74789354 0.31772038
0.89805721 0.04407727 0.09535924
0.01960635 0.13639495 0.08503445
0.60042328 0.54392927 0.30715808
0.89205404 0.17572676 0.17279700

Используя perl:

$ perl -s -pe 's.Прямая конфигурация= \K\d+.$&+$var.e' -- -var=1000 ваш-файл
  • переменные могут быть -sет¹ из командной строки.
  • s заменяет текст, сохраняя совпавший текст перед \K.
  • /eвал² является модификатором замены.

¹ См. https://stackoverflow.com/a/34868254

²Только оператор замены позволяет использовать модификатор /e. При использовании операнд замещения оценивается так, как если бы с eval{..}, результат которого заменяется на совпавший текст. Из Mastering Regular Expressions Джеффри Фридл.

.

Ответ или решение

Для выполнения задачи, связанной с обновлением чисел в файле с использованием утилит awk и sed, мы можем создать скрипт, который будет обрабатывать данные в заданном формате. Ваша задача состоит в том, чтобы увеличить значение, указанное после строки «Direct configuration=», на 1000, при этом оставляя остальные строки неизменными. Давайте рассмотрим несколько подходов для реализации этой цели.

Использование AWK

awk является мощным инструментом для обработки текстовых файлов, особенно когда нужно выполнять арифметические операции. Вот пример скрипта, который вы можете использовать:

awk -v increment=1000 '/Direct configuration=/ { $2 += increment } 1' input_file > output_file

Объяснение команд:

  • -v increment=1000 — задает переменную, которая хранит значение 1000.
  • /Direct configuration=/ — определяет регулярное выражение для поиска строк, содержащих «Direct configuration=».
  • { $2 += increment } — увеличивает значение второго поля строки (число после знака «=») на 1000.
  • 1 — эта конструкция является эквивалентом print и выводит текущую строку.

Вывод данной команды будет записан в файл output_file, сохраняя все остальные строки в прежнем виде.

Использование Sed

sed — это еще один удобный инструмент, который можно использовать для текстовой замены. Вот как можно это сделать:

sed -E "s/(Direct configuration= )([0-9]+)/echo \"\$((${2}+1000))\"/ge" input_file > output_file

Пояснение команды:

  • -E — включает расширенные регулярные выражения.
  • s/(Direct configuration= )([0-9]+)/.../ge — совершает замену, где первая группа захватывает текст «Direct configuration= », а вторая группа захватывает число.
  • echo \"\$((${2}+1000))\" — выполняет вычисление, добавляя 1000 к найденному числу.
  • /g — производит глобальную замену в строке.

Этот метод может быть менее производительным, чем awk, особенно для больших файлов, но также обеспечит нужный результат.

Использование Perl

Если вы предпочитаете Perl, данный подход также будет эффективным:

perl -pe 's/(Direct configuration= )(\d+)/$1 . ($2 + 1000)/e' input_file > output_file

Объяснение команды:

  • -pe — обрабатывает файл, читая его построчно и используя регулярные выражения.
  • s/(Direct configuration= )(\d+)/$1 . ($2 + 1000)/e — находит строку с «Direct configuration=» и заменяет вторую группу (число) на результат сложения с 1000. Весь остальной текст строки остается неизменным.

Вывод

Каждый предложенный метод имеет свои преимущества, но awk обычно предпочтителен для простых арифметических операций из-за своей ясности и простоты в использовании. После выполнения нужного скрипта результат будет сохранен в указанном output_file, где каждое число после «Direct configuration=» будет увеличено на 1000, а остальные строки останутся неизменными.

Выберите подходящий для вас метод, исходя из ваших предпочтений и требований к производительности. Убедитесь, что сделанная модификация данных соответствует вашим ожиданиям, после чего вы сможете применять данные в дальнейшем анализе или отчетности.

Оцените материал
Добавить комментарий

Капча загружается...