Intereting Posts
Как я могу перетаскивать окна в Openbox без заголовка? Рабочая станция с высокой задержкой для VM-ориентированной рабочей станции по сравнению с малой задержкой (но хак-иш) для Oracle 11g curl написать http-код для stderr или в файл Проблема с запуском: неверная таблица разделов или использование UEFI BOOT Изменение существующей записи маршрута в Linux Ошибка, постоянно отображаемая в терминале после установки ESET NOD32 для Linux 64 бит Установка драйвера, не удалось получить cdrom: // ls -l – групповые каталоги – сначала (действуют также на символические ссылки) Как заставить рабочую станцию ​​vmware 12.5.5 использовать графическую карту nvidia с optirun / primusrun? Никакая перегрузка GPU не была задействована Должен ли серьезный студент * nix выбрать дистрибутив, совместимый с POSIX, чтобы хорошо изучить стандартные функции? Передача шаблона печати как переменной в awk Поиск Bash и запуск предыдущей команды Как скопировать стандартный вывод и стандартную ошибку в журнал? Различное поведение mktemp Ubuntu 12.02 / Mint 9 Isadora Неспособность блокировать грубую силу ssh с помощью iptables

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

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

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

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

 10 -0.0627229 20 -0.0994193 30 -0.1254623 

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

  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