ファイルの日付形式の変更[重複]

ファイルの日付形式の変更[重複]

Sample.txtという名前の次のファイルがあります。

[Sat Sep 10 06:31:41 2016]!Node2!Node1!Node3
[Sun Sep 11 23:31:41 2016]!Node2!Node1!Node3

このように見えるように修正する必要があります。日付形式をこの形式に変更する必要があります。

  2016-09-10 06:31:41!ER_DEV!Node2!Node1!Node3
  2016-09-11 23:31:41!ER_DEV!Node2!Node1!Node3

答え1

awk以下の助けを借りて使用されますdate

awk -F '[[\\]]' '{cmd="date -d \""$2"\" \"+%F %T\""; cmd | getline out; print out $3}'
  • -F '[[\\]]'フィールド区切り文字を[または]に設定すると、日付はフィールド2にあり、残りはフィールド3にあります。

  • 変数には、2番目のフィールドを目的の形式に変換するコマンドがcmd含まれており、外部コマンドを実行して出力を変数に保存します。dategetlinedateout

  • out最後に、変数の内容と3番目のフィールドを印刷します。

例:

% cat file.txt
[Sat Sep 10 06:31:41 2016]!Node2!Node1!Node3
[Sun Sep 11 23:31:41 2016]!Node2!Node1!Node3

% awk -F '[[\\]]' '{cmd="date -d \""$2"\" \"+%F %T\""; cmd | getline out; print out $3}' file.txt
2016-09-10 06:31:41!Node2!Node1!Node3
2016-09-11 23:31:41!Node2!Node1!Node3

答え2

Perlモジュールでstrptime/を使用してください:strftimeTime::Piece

perl -MTime::Piece -pe '
  s/\[(.*?)\]/Time::Piece->strptime($1, "%a %b %d %H:%M:%S %Y")->strftime("%Y-%m-%d %H:%M:%S!ER_DEV")/e
' Sample.txt
2016-09-10 06:31:41!ER_DEV!Node2!Node1!Node3
2016-09-11 23:31:41!ER_DEV!Node2!Node1!Node3

答え3

sed次の強力な純粋なコマンドを使用してこれを実行できます。

sed 's/^.... //
     s/^Jan /01/; s/^Feb /02/; s/^Mar /03/; s/^Apr /04/; s/^May /05/; s/^Jun /06/
     s/^Jul /07/; s/^Aug /08/; s/^Sep /09/; s/^Oct /10/; s/^Nov /11/; s/^Dec /12/
     s/^\(..\) /\10/; s/^\(..\)\(..\)\( ........\) \(....\)./\4-\1-\2\3/'
  • s/^.... //[ 曜日と(3文字の略語)を削除してください。
  • s/^Jan /01/など、月(名前の3桁の略語)(および次のスペース)を対応する数値(月番号)に置き換えます。
  • s/^\(..\) /\10/1桁の日付(日)の値(つまり、前にスペースがある10未満の数字)を確認し、前にゼロがあるように変更します。例えば、
      [Sat Sep 3→→09 30903
  • s/^\(..\)\(..\)\( ........\) \(....\)./\4-\1-\2\3/ 残りの日付/時刻文字列をmmdd HH:MM:SS YYYY]次から変換します。YYYY-mm-dd HH:MM:SS。 (質問など、出力に先行スペースを表示するには、このコマンドにスペースを追加します。)

メモ:

  • これはエラー処理を実行しません。入力が話したものと異なる場合、出力は混乱します。
  • これは月名を英語でハードコードし、ロケール設定には適用されません。

関連情報