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 строк числовых данных в 3 столбца)

Прямая конфигурация= 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=5 '/Прямая конфигурация/{$NF+=val}1' file
Прямая конфигурация= 10
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' file
Прямая конфигурация= 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

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

Использование awk для замены чисел в цикле

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

Подготовка к работе

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

Пример решения с использованием awk

Вот как можно реализовать поставленную задачу с помощью awk:

awk -v increment=1000 '
/Direct configuration=/ {
    $2 += increment  # Добавляем 1000 к числу после "Direct configuration="
}
1  # Печатаем изменённую строку (включая остальные строки без изменений)
' ваш_файл.txt > новый_файл.txt

Объяснение:

  1. -v increment=1000: Задаём переменную increment, которая будет хранить значение, добавляемое к каждому числу.

  2. /Direct configuration=/: Эта регулярное выражение ищет строки, содержащие Direct configuration=.

  3. $2 += increment: Увеличиваем вторую колонку (число после =) на значение переменной increment.

  4. 1: Это эквивалент команды print. Она позволяет выводить текущую строку, внесённую или нет изменений.

  5. ваш_файл.txt: Укажите имя вашего входного файла.

  6. > новый_файл.txt: Перенаправляем вывод в новый файл, чтобы сохранить изменения.

Альтернативное решение с использованием sed

Если вы предпочитаете использовать sed, можно также выполнить аналогичные изменения, хотя в этом случае потребуется немного больше громоздкости для выполнения арифметических операций:

sed -E '/Direct configuration=/ s/([0-9]+(?:\.[0-9]+)?)/echo $((\1 + 1000))/e' ваш_файл.txt > новый_файл.txt

Объяснение:

  1. -E: Используется для включения расширенных регулярных выражений.

  2. /Direct configuration=/: Проверяет, содержит ли строка указанный текст.

  3. s/([0-9]+(?:\.[0-9]+)?)/echo $((\1 + 1000))/e: Заменяет каждое найденное число на результат выражения echo (в данном случае — исходное число + 1000). Опция e включает выполнение команд.

Вывод

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

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

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

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