0

GMT オフセットを含むタイムスタンプ フィールドを持つレコードを含むファイルがあります。sedコマンドを使用して、レコードの値を通常のタイムスタンプ (GMT オフセットなし) に置き換えたいと考えています。

例えば:

`$date -d '2012/11/01 00:50:22 -0800' '+%Y-%m-%d %H:%M:%S'`

私がやろうとしているこの値を返します:

2012-11-01 01:50:22

このファイルのすべての行でその操作を実行し、日付コマンドをタイムスタンプ値に適用することを除いて。サンプル レコードは次のとおりです。

"SB","6GV96644X48128125","","","","T0006",2012/10/03 13:08:43 -0700,"NJ"

これが私のコードです:

head -1 myfile | sed 's/,[0-9: /\-]\{25\},/,'"`date -d \1 '+%Y-%m-%d %H:%M:%S'`"',/

これは機能しません: \1 を無視し、一致したパターンを今日の日付に置き換えます:

"SB","6GV96644X48128125","","","","T0006",2012-11-14 01:00:00,"NJ"

一致したパターンが日付関数に渡され、通常のタイムスタンプ値が返されることを願ってい\1ました (日付関数が GMT オフセットを適用し、通常の stimestamp 文字列を返す方法を示す上記の例のように) 古い記録上の価値。

4

4 に答える 4

2

代わりに使用awkします。例えば:

awk '{cmd="date -d \""$7"\" \"+%Y-%m-%d %H:%M:%S\"";
    cmd | getline k; $7=k; print}' FS=, OFS=, myFile

これにより、7 番目のフィールドが、7 番目のフィールドの元の内容に対して date コマンドを実行した結果に置き換えられます。

于 2012-11-15T18:02:51.927 に答える
0

sed

head -1 datefile |
  sed '
    # handle % in input correctly
    s/%/%%/g
    # execute date(1) command
    s/\(.*,\)\([0-9: /\-]\{25\}\)\(,.*\)/'"date -d '\2' '+\1%Y-%m-%d %H:%M:%S\3'"'/e'
  '
于 2012-11-15T19:00:49.247 に答える
0

使用する

head -1 datefile | sed -e 's?\(..\)/\(..\)/\(.... ..:..:..\)?'"date -d '\2/\1/\3' '+%s'"'?e'
于 2015-02-05T13:25:50.467 に答える
0

これはうまくいくかもしれません(GNU sed):

sed -r 's/^(([^,]*,){6})([^,]*)(.*)/printf "%s%s%s" '\''\1'\'' $(date -d '\''\3'\'' '\''+%Y-%m-%d %H:%M:%S'\'') '\''\4'\''/e;q' file
于 2012-11-16T07:50:19.340 に答える