ファイルの日付形式を変換する方法

ファイルの日付形式を変換する方法

入力ファイル:3つの列が含まれており、3番目の列はサンプルデータ型DD-MMM-YYYY
日付です。

1232,abdc, 02-Jan-2014
4534,kdafh, 20-Feb-2014
364,asjhdk, 11-Jul-2012

希望の出力:

1232,abdc, 2014-01-02
4534,kdafh, 2014-02-20
364,asjhdk, 2012-07-11

日付機能を使用する:date -d 20-DEC-2014 +%Y-%m-%d
awkコマンドを使用してエラーを発生させる他の方法はありますか

答え1

入力ファイルがinput-file.txtで、出力ファイルがoutput-file.txtであると仮定すると、awkを使用して考えられる答えの1つは次のとおりです。

awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d "$3" +%Y-%m-%d");}' input-file.txt > output-file.txt

答え2

使用ミラーmlr)ヘッダーなしのCSV入力で余分なスペースをクリーンアップした後、3番目のフィールドを書き換えます。時刻書式文字列を使用して指定されたstrptime()日付を解析し、書式文字列%d-%b-%Ystrftime()たとえば代わり​​に%F使用可能)を使用して結果のUnixタイムスタンプの書式を再指定して、3番目のフィールドを再構築します。%Y-%m-%d%F

mlr --csv -N \
    clean-whitespace then \
    put '$3 = strftime(strptime($3,"%d-%b-%Y"),"%F")' file

質問のデータが与えられると、以下が出力されます。

1232,abdc,2014-01-02
4534,kdafh,2014-02-20
364,asjhdk,2012-07-11

データの同じフィールドにタイムスタンプがある場合は、使用される書式文字列を調整して必要strptime()strftime()応じて呼び出すことができます。

strftimeこれらの書式文字列の意味と日付と時刻の書式設定オプションについては、システムのマニュアルを参照してください。

答え3

入力したテキストが次のとおりです。

1232,abdc, 02-Jan-2014 18:01:37</br> 
4534,kdafh, 20-Feb-2014 07:17:19</br>
364,asjhdk, 11-Jul-2012 23:20:30</br>

私の答えは次のとおりです。

cat input-file.txt | sed 's[</br>[[g' | awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d \""$3" "$4"\" +\"%Y-%m-%d %H:%M:%S\"");}' > output-file.txt

レコードが1行にある場合(入力ファイルの</br>の後に改行なし)

cat input-file.txt | sed 's[</br>[\n[g' | awk -F ',' '{printf("%s,%s,",$1,$2);system("date -d \""$3" "$4"\" +\"%Y-%m-%d %H:%M:%S\"");}' > output-file.txt

答え4

ファイルの各行に対してシェルとは異なるコマンドを実行するための新しいプロセスを作成したくありません。これは非常に非効率的です。コードの入力ベースのシェル解析を使用することも、コマンド注入の脆弱性を引き起こす方法です。また、この-dオプションは標準ではありません。

ここでは、Perlなどの時間操作が可能なテキスト処理ツールを使用します。

perl -MTime::Piece -pe '
  s{\d+-\w+-\d+$}{Time::Piece->strptime($&, "%d-%b-%Y")->ymd}e
  ' < your-file

<digits>-<word-characters>-<digits>そこで行末の find() を一致させ$、解釈し、Perl のコア Time::Piece モジュールを使用<day>-<month-abbrev>-<year>するように再フォーマットします。<yead>-<month>-<day>

関連情報