Как вычесть строки из первой строки с помощью awk?

Мой файл данных выглядит так:

10 -0.314690785295 20 -0.251967909317 30 -0.215271387106 40 -0.189228416217 

Желаемый результат:

 10 -0.0627229 20 -0.0994193 30 -0.1254623 

Я действительно новичок в bash, поэтому любая помощь в отношении этого глупого запроса была бы большой помощью.

One Solution collect form web for “Как вычесть строки из первой строки с помощью awk?”

  awk 'BEGIN {first_row = 0; col_val=""}{ if (first_row == 0) {first_row = $2; col_val=$1} else {print col_val " " first_row - $2; col_val=$1}}' 

Это вывод из командной строки:

  $ echo "10 -0.314690785295 20 -0.251967909317 30 -0.215271387106 40 -0.189228416217" | awk 'BEGIN {first_row = 0; col_val=""}{ if (first_row == 0) {first_row = $2; col_val=$1} else {print col_val " " first_row - $2; col_val=$1}}' 10 -0.0627229 20 -0.0994194 30 -0.125462 

Хорошо, почему это работает:

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

В основной части программы во втором наборе {}. мы определяем логику, которая будет выполняться для каждой строки на входе (вы также можете добавить шаблон для работы только на некоторых строках, но это выходит за рамки этого ответа).

Логика проверяет, установлено ли значение first_row. Если это не так, то это первая строка ввода, и нам просто нужно инициализировать значение first_row, чтобы быть вторым sting в строке, которая равна $ 2, нам также нужно скопировать строку, которая была в первом столбце $ 1 чтобы соответствовать вашему желаемому результату, мы скопируем это значение в col_val.

Else, который представляет собой каждую другую строку на входе, мы печатаем col_value пробел и результат вычитания first_row со значением в текущей строке во второй позиции $ 2, поэтому first_row – $ 2. Затем мы копируем новое строковое значение в первом столбце ввода в col_val.

Я не понимал, что вам действительно нужно в первый раз 🙂 .. Это awk-скрипт, который будет делать то, что вы хотите … потому что 10-20 – это не 10, а 10.

  awk '{ if (NR == 1) { for (i = 1; i <= NF; i++){ first_row[i] = $i} } else { for (i = 1; i <= NF; i++){ printf "%s ", first_row[i] - $i }; printf "\n"}}' 

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

  echo "10 -0.314690785295 18 20 -0.251967909317 12 30 -0.215271387106 35 40 -0.189228416217 44" | awk '{ if (NR == 1) { for (i = 1; i <= NF; i++){first_row[i] = $i} } else { for (i = 1; i <= NF; i++){ printf "%s ", first_row[i] - $i }; printf "\n"}}' -10 -0.0627229 6 -20 -0.0994194 -17 -30 -0.125462 -26 
  • Переформатировать каждую двухстрочную последовательность на две колонки
  • Выбор двух наборов условий в awk
  • замените значения полей в каждой строке значениями в предыдущих полях до конца каждой строки
  • Проблема с awk-совпадением
  • linux, если else не работает для некоторых IP-адресов
  • Сопоставьте несколько регулярных выражений из одного файла с помощью awk
  • Awk Search - комбинированные классы символов в одной строке
  • awk: Извлечение фиксированного числа строк, в котором последнее число строк может изменяться
  • Объединить две операции в одну команду - awk
  • Упрощение однострочного вызова с помощью sed и нескольких вызовов awk
  • Шаблон совпадения, выполнить расчет и распечатать только 3 или 4 значения плавающего значения max
  • Interesting Posts

    Полноэкранные программы обновляются только при перемещении мыши

    Нет звука в Lenovo Ideapad

    Невозможно выполнить какую-либо операцию на плате MircoSD

    Включение трехстрочной настройки с двумя Nvidia GT730 (Ubuntu)

    Создание символической ссылки внутри profile.d не работает. Обходной путь?

    Не удалось войти на сервер Ubuntu 10.04 после попытки присоединиться к домену Windows

    Поиск и замена VIM

    как создать пользовательский сеанс рабочего стола для x2go

    Live Linux Distro, который как можно меньше (нет X, нет сетей, bash)

    Есть ли обратная совместимость опции -p (–path) в командах пользователя / группы?

    Диапазон идентификаторов процессов

    Использование Cgroups с Systemd для ограничения bash cpu & memory

    Команда «cp p2 & 2 &» заставляет Konsole исчезать, это ошибка?

    Мне нужно подключиться к пользователю IPA и запустить программу как root без паролей

    Какие метаданные разделяют мой Linux через Wi-Fi?

    Linux и Unix - лучшая ОС в мире.