【问题标题】:jq parsing date to timestampjq将日期解析为时间戳
【发布时间】:2018-03-18 01:55:15
【问题描述】:

我有以下脚本:

curl -s -S 'https://bittrex.com/Api/v2.0/pub/market/GetTicks?marketName=BTC-NBT&tickInterval=thirtyMin&_=1521347400000' | jq -r '.result|.[] |[.T,.O,.H,.L,.C,.V,.BV] | @tsv | tostring | gsub("\t";",") | "(\(.))"'

这是输出:

(2018-03-17T18:30:00,0.00012575,0.00012643,0.00012563,0.00012643,383839.45768188,48.465051)
(2018-03-17T19:00:00,0.00012643,0.00012726,0.00012642,0.00012722,207757.18765437,26.30099514)
(2018-03-17T19:30:00,0.00012726,0.00012779,0.00012698,0.00012779,97387.01596624,12.4229077)
(2018-03-17T20:00:00,0.0001276,0.0001278,0.00012705,0.0001275,96850.15260027,12.33316229)

我想用时间戳替换日期。

我可以在 shell 中使用日期进行这种转换

date -d '2018-03-17T18:30:00' +%s%3N
1521325800000

我想要这个结果:

(1521325800000,0.00012575,0.00012643,0.00012563,0.00012643,383839.45768188,48.465051)
(1521327600000,0.00012643,0.00012726,0.00012642,0.00012722,207757.18765437,26.30099514)
(1521329400000,0.00012726,0.00012779,0.00012698,0.00012779,97387.01596624,12.4229077)
(1521331200000,0.0001276,0.0001278,0.00012705,0.0001275,96850.15260027,12.33316229)

此数据存储在 MySQL 中。

是否可以在单个命令行中使用 jq 或其他命令(如 awk、sed、perl)执行日期转换?

【问题讨论】:

    标签: datetime awk sed jq


    【解决方案1】:

    这是一个假设“Z”(UTC+0)时区的全 jq 解决方案。

    简而言之,只需将.T 替换为:

    ((.T + "Z") | fromdate | tostring + "000")
    

    要验证这一点,请考虑:

    timestamp.jq

    [splits("[(),]")]
    | .[1] |= ((. + "Z")|fromdate|tostring + "000")  # milliseconds
    | .[1:length-1]
    | "(" + join(",") + ")"
    

    调用

    jq -rR -f timestamp.jq  input.txt
    

    输出

    (1521311400000,0.00012575,0.00012643,0.00012563,0.00012643,383839.45768188,48.465051)
    (1521313200000,0.00012643,0.00012726,0.00012642,0.00012722,207757.18765437,26.30099514)
    (1521315000000,0.00012726,0.00012779,0.00012698,0.00012779,97387.01596624,12.4229077)
    (1521316800000,0.0001276,0.0001278,0.00012705,0.0001275,96850.15260027,12.33316229)
    

    【讨论】:

    • jq 获胜,只需替换 .T ,代码更短。再次感谢!
    【解决方案2】:

    这是一个不可移植的 awk 解决方案。它不可移植,因为它依赖于系统date 命令;在我正在使用的系统上,相关调用如下所示:date -j -f "%Y-%m-%eT%T" STRING "+%s"

    awk -F, 'BEGIN{OFS=FS}
      NF==0 { next }
      { sub(/\(/,"",$1);
        cmd="date -j -f \"%Y-%m-%eT%T\" " $1 " +%s";
        cmd | getline $1;
        $1=$1 "000";     # milliseconds
        printf "%s", "(";
        print;
      }' input.txt
    

    输出

    (1521325800000,0.00012575,0.00012643,0.00012563,0.00012643,383839.45768188,48.465051)
    (1521327600000,0.00012643,0.00012726,0.00012642,0.00012722,207757.18765437,26.30099514)
    (1521329400000,0.00012726,0.00012779,0.00012698,0.00012779,97387.01596624,12.4229077)
    (1521331200000,0.0001276,0.0001278,0.00012705,0.0001275,96850.15260027,12.33316229)
    

    【讨论】:

    • 我修改了命令日期:awk -F, 'BEGIN{OFS=FS} NF==0 { next } { sub(/(/,"",$1); cmd="date - d " $1" +%s%3N"; cmd | getline $1; printf "%s", "("; print;}'; 这可行,但它从系统中获取日期 gmt。谢谢
    【解决方案3】:

    使用 sed 的解决方案:

     sed -e 's/(\([^,]\+\)\(,.*\)/echo "(\$(date -d \1 +%s%3N),\2"/g' | ksh
    

    测试:

      <commande_curl> | sed -e 's/(\([^,]\+\)\(,.*\)/echo "(\$(date -d \1 +%s%3N),\2"/g' | ksh
    

    或:

      <commande_curl> > results_curl.txt
      cat results_curl.txt | sed -e 's/(\([^,]\+\)\(,.*\)/echo "(\$(date -d \1 +%s%3N),\2"/g' | ksh
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-19
      • 1970-01-01
      • 2021-11-23
      • 2021-02-08
      • 1970-01-01
      • 2020-09-16
      相关资源
      最近更新 更多