CSVファイルの日付形式

CSVファイルの日付形式

私の質問の短いバージョンは次のとおりです。カンマで区切られた日付のリストをある形式から別の形式に変換するには?具体的には、次の形式の文字列を変換する1行のコマンドが必要です。

YYYY/MM/DD,YYYY/MM/DD

次の形式の文字列です。

DD/MM/YYYY,DD/MM/YYYY

今私の問題の背景を説明します。

行には、次の形式の隣接する日付ペアを含むCSVファイルがあります。

YYYY/MM/DD

grepこの日付ペアを抽出するには、次のコマンドを実行します。

grep -Po '[1-2][0-1][0-9][0-9]/[0-1][0-9]/[0-1][0-9]','[1-2][0-1][0-9][0-9]/[0-1][0-9]/[0-1][0-9]' file.csv`

たとえば、次の文字列が生成されます。

2016/05/16,2017/06/15

date以下を使用して単一の日付文字列を変換できます。

date -d '2016/05/16' '+%d/%m/%Y'

これにより、目的の結果が生成されます。

16/05/2016

このコマンドを次のような複数の入力文字列に適用してみました。

date -d"2016/05/16","2017/06/15" "+%d-%m-%Y"

しかし、それはうまくいきませんでした。次のエラーメッセージが表示されます。

Error :- Invalid date - 2016/05/16,2017/06/15'

私が望む2016/05/16,2017/06/15ものは16/05/2016,15/06/2017

答え1

sedを使用してください...

echo "2016/05/16,2017/06/15" | sed 's/\([0-9]\{4\}\)\/\([0-9]\{2\}\)\/\([0-9]\{2\}\),\([0-9]\{4\}\)\/\([0-9]\{2\}\)\/\([0-9]\{2\}\)/\3\/\2\/\1,\6\/\5\/\4/g'
16/05/2016,15/06/2017

答え2

date -d以下は、このコマンドの使用を拡張するソリューションです。シェルスクリプトと標準GNUコマンドラインtrツールのみを使用してくださいpaste

tr ',' '\n' \
| while read line; do date -d "${line}" "+%d/%m/%Y"; done \
| paste -d, -s -

tr1行の入力を2行に分割するために、カンマを改行文字に変換するために使用します。次に、2行をwhileループにリンクし、各行に書式設定コマンドを適用しますdate。最後に変換された日付文字列をパイプして、単一のカンマ区切りpasteリストに再組み立てします。

サンプル入力は次のとおりです。

echo 2016/05/16,2017/06/15 \
| tr ',' '\n' \
| while read line; do date -d "${line}" "+%d/%m/%Y"; done \
| paste -d, -s -

これが生成する出力は次のとおりです。

16/05/2016,15/06/2017

これをgrep投稿のコマンドと組み合わせると、次のような結果が得られます。

grep -Po '[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-1][0-9]','[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-1][0-9]' file.csv \
| tr ',' '\n' \
| while read line; do date -d "${line}" "+%d/%m/%Y"; done \
| paste -d, -s -

で使用される正規表現を短くすることもできますgrep。おそらくこのようなことも機能します(末尾のコンマと一致します)。

grep -Po '([12][0-9]{3}(/[01][0-9]){2},?){2}' file.csv

最後に、出力リダイレクトを使用して結果をファイルに書き込むことができます。

grep -Po '[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-1][0-9]','[1-2][0-9][0-9][0-9]/[0-1][0-9]/[0-1][0-9]' file.csv \
| tr ',' '\n' \
| while read line; do date -d "${line}" "+%d/%m/%Y"; done \
| paste -d, -s - \
> new_file.csv

関連情報