Проверьте, соответствует ли данный формат strftime дате

У меня есть формат времени strftime, скажем, (%Y-%m-%d %H:%M:%S) и файл, который должен содержать такие данные, например. (2012-02-11 17:15:00). Мне нужно проверить, действительно ли данный шаблон соответствует данным. Как к этому подступиться? ок, свидание?

EDIT: Дополнительная информация: пользователь вводит формат strftime, скажем, при вводе. Затем он вводит файл, который должен содержать эти даты. Мне нужно убедиться, что эти данные верны (он не ошибся). Поэтому мне нужно проверить строки во входном файле и посмотреть, есть ли данные, соответствующие заданному шаблону. Пример:

  • пользователь вводит формат strftime: (%Y-%m-%d %H:%M:%S)

    входной файл: (2012-02-11 17:15:00) long sentence

    ДЕЙСТВИТЕЛЬНО

  • пользователь вводит формат strftime: Date[%Y.%m.%d %H:%M:%S]

    входной файл: Date-2012.02.11 17:15:00- long sentence

    НЕ ДЕЙСТВИТЕЛЬНО


person tsusanka    schedule 10.04.2012    source источник
comment
Я не понимаю, ты хочешь этого - echo "(2012-02-11 17:15:00)" | gawk '{if (NR==1) print strftime("(%Y-%m-%d %H:%M:%S)"), $0}'   -  person yazu    schedule 10.04.2012
comment
Я удалил свою попытку решить ее, так как, как я понял, это была ерунда. Мне просто нужно проверить, совпадает ли он. Спасибо   -  person tsusanka    schedule 10.04.2012
comment
возможный дубликат awk - проверка тайм-кода   -  person Dennis Williamson    schedule 11.04.2012
comment
действительно, похоже. Есть хорошее решение с использованием python, но это все   -  person tsusanka    schedule 12.04.2012


Ответы (3)


Если вы разрешите внешний вспомогательный двоичный файл, я написал dateutils для пакетной обработки данных о дате и времени.

dconv -q -i '(%Y-%m-%d %H:%M:%S)' <<EOF
not a match: 2012-04-10 12:00:00
a match: (2012-04-10 13:00:00)
EOF

дам

2012-04-10T13:00:00

-i — формат ввода, -q подавляет предупреждения. И dconv пытается преобразовать входные строки в выходные строки (в этом случае он преобразует совпадающие строки в стандартный формат ISO.

Таким образом, используя это, файл полностью совпадает, если количество входных строк равно количеству выходных строк.

person hroptatyr    schedule 10.04.2012
comment
К сожалению, я, вероятно, не знаю, так как это домашнее задание, и я должен использовать только стандартные программы Unix. Это именно то, что я пытаюсь сделать. Нельзя ли это сделать с помощью awk? Спасибо за ответ. - person tsusanka; 10.04.2012
comment
проблема в том, что в awk нет функции strptime(), как и в perl, к сожалению (без учета расширений CPAN) - person hroptatyr; 10.04.2012
comment
хм, я провел много исследований, и я просто не могу ничего найти. То есть вы действительно думаете, что это невозможно решить без C? - person tsusanka; 10.04.2012
comment
нет, я не говорю, что это невозможно сделать, я имею в виду, что было бы намного проще, если бы awk/perl/foo имел strptime(), тогда вы просто перешли бы strptime("(%Y-%m-%d %H:%M:%S)", $input), и если это удалось без ошибок, вы знаете, что дата была проанализирована правильно. - person hroptatyr; 10.04.2012
comment
@hroptatyr: Perl Time::Piece — это основной модуль, который предоставляет strptime(). Python предоставляет его в time и datetime. - person Dennis Williamson; 12.04.2012

Если вы хотите проверить текущую дату и время:

echo "(2012-02-11 17:15:00)" | grep "$(date "+%Y-%m-%d %H:%M:%S")"

Если какая-то другая вам нужна дата GNU (опция -d). Это работает для меня:

echo "(2012-02-11 17:15:00)" | 
grep "$(date -d "2012-02-11 17:15:00"  "+%Y-%m-%d %H:%M:%S")"
person yazu    schedule 10.04.2012
comment
Это проверяет только данные внутри, но мне также нужно проверить скобки. Например, это также проверит x2012-02-11 17:15:00)... К сожалению (давайте поменяем скобки на x) echo "x2012-02-11 17:15:00x" | grep "$(date -d "x2012-02-11 17:15:00x" "+x%Y-%m-%d %H:%M:%Sx")" не работает - person tsusanka; 10.04.2012
comment
Я хотел бы изменить свой вопрос для лучшего понимания, но я просто не знаю, как... вы знаете, чего я хочу достичь? - person tsusanka; 10.04.2012
comment
Что ж, просто добавьте круглые скобки в спецификатор даты: grep "$(date -d "2012-02-11 17:15:00" "+(%Y-%m-%d %H:%M:%S)")" Если вам нужен какой-то другой ответ, я думаю, что пример ввода может помочь. - person yazu; 10.04.2012
comment
Но обратите внимание, что вы удалили скобки в опции -d. И в этом проблема. Там могут быть парантезы, которые вы удалили, но также и xxx или что-то в этом роде. Все, что указано пользователем. Добавлю несколько примеров. - person tsusanka; 10.04.2012

Я бы применил к этому подход грубой силы: замените любой спецификатор %X соответствующим регулярным выражением, тогда вы сможете отфильтровать строки, которые не соответствуют полученному регулярному выражению:

user_format="%Y-%m-%d"
awk -v fmt_string="$user_format" '
  BEGIN {
    gsub(/[][(){}?|*+.]/ "\\&", fmt_string)  # protect any regex-special chars
    gsub(/%Y/, "([0-9]{4})", fmt_string)
    gsub(/%m/, "(0[1-9]|1[012])", fmt_string)
    gsub(/%d/, "(0[1-9]|[12][0-9]|3[01])", fmt_string)
    # and so on
  }
  $0 !~ "^" fmt_string {print "line " NR " does not match: " $0}
' filename
person glenn jackman    schedule 10.04.2012
comment
ох, это жестоко... хотя, похоже, нет ничего лучше - person tsusanka; 10.04.2012