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

除了我想在该文件的每一行上执行该操作并将 date 命令应用于时间戳值。这是一个示例记录:

"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 偏移量并返回一个常规时间戳字符串)并替换旧的记录中的价值。

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 个字段的原始内容运行 date 命令的结果替换第 7 个字段。

于 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

这可能对您有用(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 回答
0

采用

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