日付が部分文字列として含まれる文字列がある場合、その部分文字列をある日付形式から別の日付形式に変換するにはどうすればよいですか?具体的には、次のような質問があります。
日付文字列「10/24/2017 8:00:00 AM」を日付文字列「20171024 8:00:00 AM」に変換するには?
「Data1|Data2|Data3|10/24/2017 AM 8:00:00」を「Data1|Data2|Data3|20171024 AM 8:00:00」に変換するには?
この形式の行(パイプで区切られたデータなど)を含む「Sample.csv」というファイルがある場合は、「Sample.csv」の各行の日付をどのように変換しますか(前の質問のように)。
答え1
date
探しているコマンドは次のとおりです。
date -d '${DATE_STRING}' '+%Y%m%d %H:%M:%S %p'
-d
(同等)フラグは、--date
日付/時刻入力を表す文字列を指定するために使用されます。このマニュアルには次のように記載されています。
日付文字列
--date=STRING は、「Sun, 29 Feb 2004 16:21:42 -0800」または「2004-02-29 16:21:42」または「Next」など、人間が読むことができるほとんどの自由形式の日付文字列です。 「木曜日」より複雑ですが、情報文書で詳しく説明されています。
投稿に提供された日付文字列を使用すると、上記の例は次のようになります。
date -d '10/24/2017 8:00:00 AM' '+%Y%m%d %H:%M:%S %p'
指定した例の文字列全体から日付を抽出するには、次のようにします。
DATE_STRING="Data1|Data2|Data3|10/24/2017 8:00:00 AM"
date -d "$(echo "${DATE_STRING}" | cut -d'|' -f4)" '+%Y%m%d %H:%M:%S %p'
単一の文字列に対して目的の最終結果を取得するには、次のようにします。
DATE_STRING="Data1|Data2|Data3|10/24/2017 8:00:00 AM"
echo "$(echo "${DATE_STRING}" | cut -d'|' -f1,2,3)|$(date -d "$(echo "${DATE_STRING}" | cut -d'|' -f4)" '+%Y%m%d %H:%M:%S %p')"
最後に、ファイルのすべての行でこのコマンドを実行するには、次のようにします。
while read line; do echo "$(echo "${DATE_STRING}" | cut -d'|' -f1,2,3)|$(date -d "$(echo "${DATE_STRING}" | cut -d'|' -f4)" '+%Y%m%d %H:%M:%S %p')"; done < Sample.csv