bash: converte datas iso para d:m:y

bash: converte datas iso para d:m:y

Eu tenho um programa que produz uma saída como esta (datas no formato 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
...

Como faço para converter a saída em datas classificadas e exclusivas:

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

E então, em cada data única, execute: mycommand --withargs [yyyy-mm-dd]?

Responder1

Você pode fazer o seguinte:

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

Responder2

Usar uma ferramenta simples de análise de texto pode não ser o melhor método se você for obter dados de fusos horários alternativos.

Talvez seja melhor colar a string formatada nodatacomando e, em seguida, use-o para reformatar como quiser. Um simples awk ou cut pode retornar resultados que não são totalmente precisos. Por exemplo, se você estivesse em PST, mas os dados obtidos estivessem em UTC, a data estaria errada em 7 em 24 horas durante os dados.

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

Responder3

cut -c 1-10 -|sort -ru

ou

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

Responder4

Assumindo datedo GNU coreutils,

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

informação relacionada