bash: ISO 日付を d:m:y に変換する

bash: ISO 日付を 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]?

答え1

次の操作を実行できます。

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

答え2

別のタイムゾーンからデータを取得する場合、単純なテキスト解析ツールを使用することは最善の方法ではない可能性があります。

フォーマットされた文字列を貼り付ける方が良いかもしれません日付コマンドを実行してから、好きなように再フォーマットして使用します。単純な awk または cut では、完全に正確ではない結果が返される可能性があります。たとえば、PST にいるのに取得したデータが UTC だった場合、日付はデータ期間中の 24 時間のうち 7 時間ずれます。

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

答え3

cut -c 1-10 -|sort -ru

または

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

答え4

dateGNU coreutilsから仮定すると、

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

関連情報