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

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

入力ファイル: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 の使用: 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 番目のフィールドを書き換えます。3 番目のフィールドは、指定された日付をstrptime()時刻書式文字列で解析し%d-%b-%Y、結果の Unix タイムスタンプをstrftime()と書式文字列を使用して再フォーマットすることによって書き換えられます (の代わりに%F、たとえば を使用できます)。%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>そこで、行末 ( $)で見つかったものに一致させ、それを として解釈し、 Perl のコア Time::Piece モジュールを使用して<day>-<month-abbrev>-<year>として再フォーマットします。<yead>-<month>-<day>

関連情報