айк; сравнение времени загадочное поведение strftime

Используйте GNU-Awk (gawk) в UNXUTILS на ПК с Win-7. Этот вопрос касается strftime (.) и сравнения времени с его использованием.

Следил за обсуждением как сравнивать значения strftime, потому что у меня похожая проблема. В данных финансового рынка у меня есть строка даты и времени (25 долларов США), заданная как «03-APR-2006 09:55:25» (поэтому время = substr (25 долларов США, 13, 8)) и моя цель состоит в том, чтобы подсчитать записи (особенно записи об отмене заказа), которые поступают после 14:00:00 (14:00).

В моем коде у меня есть строка, которая читает

{ if ($3==3) { 
 { ++CK_NR} 
 { ++CO_NR[$4, substr($25, 1, 11)] }  
 { if (strftime(substr($25, 13, 8)) > ("14:00:00"))\
  {
    { ++CK_LATE_NR }
    { ++CO_LATE_NR[$4, substr($25, 1, 11)] }
  }
 }
}}

Только что понял, что неравенство, которое я использовал -- if (strftime(substr($25, 13, 8)) > ("14:00:00")) -- имеет только строку в RHS, и я не делал эту строку аргументом другой функции strftime(.). Что озадачивает, так это то, что это НЕ дало мне ошибку.

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

gawk "{ print (strftime(\"09:55:25\") > (\"14:00:00\"))}"

дает "0" и

gawk "{ print (strftime(\"09:55:25\") ‹ (\"14:00:00\"))}"

дает "1". Руководство по GNU Awk (http://www.gnu.org/software/gawk/manual/gawk.html#Time-Functions) дает мало информации о том, что требуется для значимого сравнения. Только что попробовал вышеописанное, удалив «strftime» даже из LHS, как под

gawk "{ печать ((\"09:55:25\") > (\"14:00:00\"))}"

и

gawk "{ печать ((\"09:55:25\") > (\"14:00:00\"))}"

и получил такие же результаты. Я хочу быть уверен, что получаю правильный результат True/False, потому что GAWK сравнивает время, а не по какому-то другому внутреннему правилу, которое он использует при сравнении строк (в результате чего ограниченный тест является всего лишь совпадением). Кто-нибудь может решить эту загадку? Спасибо. Лучший,

Мерджи


person Murgie    schedule 21.01.2014    source источник
comment
Вы используете сравнение строк. Для получения дополнительной информации см. gnu.org/software/gawk/manual. /gawk.html#Ввод переменных   -  person Håkon Hægland    schedule 23.01.2014


Ответы (1)


Кажется, вы используете сравнение строк. Строки сравниваются путем сравнения первого символа каждой, затем второго символа каждой и так далее. Таким образом, "10" меньше "9", так как значение ASCII "1" меньше, чем "0", см. http://www.gnu.org/software/gawk/manual/gawk.html#Variable-Typing и http://en.wikibooks.org/wiki/An_Awk_Primer/Search_Patterns_%282%29#Logic_Operators

Если вы хотите выполнить числовое сравнение строк в форме «xx:yy:zz» (например, «10:22:45»), вы можете сначала попытаться преобразовать строку в число, используя gsub(/:/,"",str)

person Håkon Hægland    schedule 22.01.2014
comment
Я не собирался сравнивать строки. Но сравнение времен. Функция strftime(.) дала мне разумный ответ, но что меня озадачило, так это то, что она сделала это, даже когда использовалась только в одной части неравенства!! Вот что заставило меня задуматься о том, не было ли это простым совпадением. Но скоро прочитаю ваши ссылки. Спасибо. - person Murgie; 28.01.2014