テキストファイル内のタイムスタンプ変換

テキストファイル内のタイムスタンプ変換

UDBからローカルにテーブルを抽出してcsvファイル形式に変換しました。抽出後、何度も表示されたタイムスタンプがめちゃくちゃになりました。タイムスタンプ形式が表示されたときに更新するシェルスクリプトを作成したいと思います。

現在のタイムスタンプ:

2009-06-08-11.15.45.589225

必須タイムスタンプ:

2009-06-08 11:15:45.589225

sedとコマンドを試しましたが、awkファイル内の現在のタイムスタンプを識別するのは少し難しいです。

助けてください?

答え1

これは働きます:

sed -Ei 's/([0-9]{4}-[0-9]{2}-[0-9]{2})-([0-9]{2}).([0-9]{2}).([0-9]{2}).([0-9]{6})/\1 \2:\3:\4.\5/g' filename

括弧はタイムスタンプを5つのグループに分けているため、\1は2009に置き換えられ、\2は06に置き換えられる式です。

答え2

GNUの1つの可能性sed

sed -Ei 's/([0-9]{4}-[0-9]{2}-[0-9]{2})-([0-9]{2}).([0-9]{2}).([0-9]{2})/\1 \2:\3:\4/' file

([0-9]{4}-[0-9]{2}-[0-9]{2})-([0-9]{2})\.([0-9]{2})\.([0-9]{2})パターンを見つけて合計をYYYY-MM-DD-HH.MM.SSキャプチャします。 。YYYY-MM-DDHHMMSS

/\1 \2:\3:\4/パターン全体(YYYY-MM-DD-HH.MM.SS)をキャプチャされたパターン(YYYY-MM-DD)(HH)(MM)(SS)に変更し、ダッシュを空白にし、点を次に置き換えます。:

答え3

tr -c '0-9' '[\n*]' | paste -d '-- ::.'  - - - - - - -

これは、入力内の数字以外のすべての文字を改行で置き換え、次にpasteこのオプションで指定された区切り文字を使用して、7つのフィールドの出力を生成します。-d

テスト:

$ echo '2009-06-08-11.15.45.589225' | tr -c '0-9' '[\n*]' | paste -d '-- ::.'  - - - - - - -
2009-06-08 11:15:45.589225
$ cat file
2009-06-08-11.15.45.589225
2009-07-09-11.15.45.222222
2009-08-10-11.15.45.333333
$ tr -c '0-9' '[\n*]' <file | paste -d '-- ::.'  - - - - - - -
2009-06-08 11:15:45.589225
2009-07-09 11:15:45.222222
2009-08-10 11:15:45.333333

関連情報