2014-01-21 7 views
0

Используйте GNU-Awk (gawk) в UNXUTILS на компьютере Win-7. Этот вопрос касается strftime (.) И сравнения времени с этим.awk; сравнение времени - непонятное поведение strftime

После обсуждения how to compare strftime values, поскольку у меня есть аналогичная проблема. В данных финансового рынка у меня есть дата-строка ($ 25), указанная как «03-APR-2006 09:55:25» (так что time = 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)] } 
    } 
} 
}} 

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

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

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

делает выход "0" и

Gawk "{печать (STRFTIME (\" 09: 55: 25 \ ") < (\" 14: 00: 00 \ "))}"

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

простака "{печать ((\" 09: 55: 25 \ ")> (\" 14: 00: 00 \»))}»

и

простак "{печать ((\" 09: 55: 25 \ ")> (\" 14: 00: 00 \ "))}"

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

Murgie

+0

Вы используете сравнения строк.Для получения дополнительной информации см. Http://www.gnu.org/software/gawk/manual/gawk.html#Variable-Typing –

ответ

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)

+0

Я не собирался сравнивать строки. Но сравнение раз. strftime (.) дал мне разумный ответ, но меня озадачило то, что он сделал это даже при использовании только на одной стороне неравенства !! Именно это заставило меня беспокоиться о том, было ли это просто совпадением. Но скоро прочитаю ваши отзывы. Благодарю. – Murgie

Смежные вопросы