Intereting Posts
Сеансы X11: когда сеанс начинается и заканчивается, выполняется ли `gdm` сеанс? awk: печатать текст между двумя шаблонами + x строк с последующим первым соответствием Понимание вывода apt-cache зависит и apt-cache showpkg Изменить дату сервера с помощью PHP Насколько безопасны репозитории по умолчанию для Fedora, CentOS и Debian? Как проверить, является ли команда псевдонимом, функцией или двоичным? Stat работает в Bash 4.3, но не в Bash 3.2? Проблема с специальным разрешением каталога Проблема с диспетчером пакетов opkg в встроенном потоке Angstrom на процессоре Colibri ARM v7 Диапазон возможного значения, возвращаемого cksum Как отключить сенсорную панель или предотвратить случайный щелчок при вводе на Fedora 24? Выполнить конкретную команду в заданной директории без cd'ing? Как убедиться, что значения nproc действуют для всех пользователей? Объединение нескольких полей отдельно на основе одной (ключевой) колонки Как найти фактический бинарный / скрипт, используя «which» в zsh?

Как принять абсолютное значение с помощью awk?

Если у меня ниже двух дат:

2015-09-12,2015-08-13 

И мне нужно получить количество дней между ними, я буду использовать приведенный ниже код:

 awk -F'[-,]' '{print 360*($4-$1)+30*($5-$2)+($6-$3)}' 

Выход для этого кода будет -29 то время как на самом деле разница составляет 29

Пожалуйста, порекомендуйте,

Вы можете определить функции в awk как:

 awk -F'[-,]' ' function abs(v) {return v < 0 ? -v : v} {print abs(360*($4-$1)+30*($5-$2)+($6-$3))}' 

Общим трюком для подобных ситуаций является использование квадратного корня из квадрата:

 awk -F'[-,]' '{print sqrt((360*($4-$1)+30*($5-$2)+($6-$3))^2)}' 

Другой путь:

 awk -F'[-,]' '{d=360*($4-$1)+30*($5-$2)+($6-$3);print (d>0)?d:-d}' 

Предполагая, что вы на GNU awk , функция funky mktime пригодится здесь.

 awk -F, '{ gsub(/-/," ",$0);a=(mktime($2 " 23 59 59")-mktime($1 " 00 00 00"))/86400;print a*(a<0?-1:1)}' file.txt 29