bash: конвертировать изо даты в d:m:y

У меня есть программа, которая производит вывод, как это (даты в формате ISO):

2010-06-04 15:48:17 +0200
2010-06-04 12:34:39 +0200
2010-02-01 14:02:44 +0200
2010-06-04 12:21:19 +0200
2010-06-04 12:21:04 +0200
2009-05-02 15:38:14 +0200
2009-03-02 15:38:09 +0200
2010-06-04 14:45:00 +0200
...

Как преобразовать выходные данные в уникальные отсортированные даты:

2010-06-04
2010-02-01
2009-05-02
2009-03-02

И затем, на каждую уникальную дату запуска: mycommand --withargs [yyyy-mm-dd]?

4 ответа

Решение

Вы можете сделать следующее:

$ <iso_command> | awk '{print $1}' | sort -u | xargs -n 1 mycommand --withargs

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

Возможно, лучше вставить форматированную строку в команду date, а затем использовать ее для переформатирования, как вам нравится. Простой awk или cut может вернуть результаты, которые не совсем точны. Например, если вы находились в PST, но полученные вами данные были в UTC, дата была бы отключена на 7 из 24 часов во время данных.

$echo '2010-06-04 15:48:17 +0200' | xargs -I var_d date --date='var_d' +%Y-%m-%d
2010-06-04

Если предположить, date из GNU coreutils,

program > dates
while read isodate; do
    ymd=$(date -d "$isodate" +'%Y-%m-%d')
    mycommand --withargs "$ymd"
done < dates

cut -c 1-10 -|sort -ru

или же

cut -c 1-10 /path/to/myfile |sort -ru

Другие вопросы по тегам