提取UTC时间并找出差异

提取UTC时间并找出差异

我有一个文件,其中包含以下买卖事件的示例记录

Buy at time=Thu Aug 03 2023 14:13:08 GMT+0200 (Central European Summer Time)

Sell-at time=Thu Aug 03 2023 14:53:02 GMT+0200 (Central European Summer Time)

我想从所有行中获取整个 UTC 字符串并获取这些记录之间的时间差,但是,我无法提取整个日期时间字符串来获取它们之间的差异。我已经尝试过这个但无法获得时间。谁能帮我吗。

while read line
do
    name=$line

    echo $name | sed -e 's/time=\(.*\)(Central/\1/'

done < $1

需要使用 shell、awk 或 sed 的解决方案。如果需要的话我也可以使用 GNU 日期

答案1

dateutils dconvdateutils.dconv在 Debian 派生系统上调用)有一个sed转换日期的模式。因此,您可以使用它将时间戳转换为纪元时间,并awk以秒为单位打印销售和购买日期之间的差异:

dateutils.dconv -SE -i ' time=%a %b %d %Y %T GMT%Z' -f '=%s=' < your-file |
  awk -F= '$1 == "Buy at"  {buy = $2; next}
           $1 == "Sell-at" {print $2 - buy}'

答案2

假设您有 Bash 和 GNU/date。

这会截掉日期中不需要的部分,然后将日期转换为纪元(自 1970 年 1 月 1 日以来的秒数)。

$ Sell='Sell-at time=Thu Aug 03 2023 14:53:02 GMT+0200 (Central European Summer Time)'
$ declare -p Sell
declare -- Sell="Sell-at time=Thu Aug 03 2023 14:53:02 GMT+0200 (Central European Summer Time)"
$ Sell="${Sell/ (*/}"
$ declare -p Sell
declare -- Sell="Sell-at time=Thu Aug 03 2023 14:53:02 GMT+0200"
$ Sell="${Sell/*=}"
$ declare -p Sell
declare -- Sell="Thu Aug 03 2023 14:53:02 GMT+0200"
$ Sell=$( date -d "${Sell}" '+%s' )
$ declare -p Sell
declare -- Sell="1691067182"
$ date -d "@${Sell}"  #.. Check correctness (in UK time).
Thu  3 Aug 13:53:02 BST 2023

对 Buy 执行相同的操作(也许声明一个函数使用两次),然后减去以秒为单位的差值。

答案3

基于如何让每一行输出不同的数据?

您需要 bash 和 GNU date 命令。

./data-diff-records.sh脚本:

#! /usr/bin/env bash

declare -r input_filename="$1"

function get_date () {
    local -r -n l_str="$1"
    local -n li_date="$2"
    local l_date="${l_str#*time=}"
    l_date="${l_date% (Central *}"
    # date transformation to seconds since 1st January 1970
    li_date=$(date -d "$l_date" +'%s')
    # printf "date=<%s>=>%d\n" "$l_date" "$li_date"
}

function diff_date () {
    local -r -n l_start_date="$1"
    local -r -n l_end_date="$2"
    local -n l_seconds_diff="$3"
    local -n l_minutes_diff="$4"
    local -n l_hours_diff="$5"
    l_seconds_diff=$(( l_end_date - l_start_date ))
    l_minutes_diff=$(( l_seconds_diff / 60 ))
    l_seconds_diff=$(( l_seconds_diff - ( l_minutes_diff * 60 ) ))
    l_hours_diff=$(( l_minutes_diff / 60 ))
    l_minutes_diff=$(( l_minutes_diff - ( l_hours_diff * 60 ) ))
}

declare -i date_buy=0
declare -i date_sell=0
declare -i seconds_diff=0
declare -i minutes_diff=0
declare -i hours_diff=0
while read -r line; do
    first_token="${line%% *}"
    case "$first_token" in
        "Buy")
            get_date line date_buy
            # echo "first_token=<$first_token> date=<$date_buy>"
        ;;
        "Sell-at")
            get_date line date_sell
            # echo "first_token=<$first_token> date=<$date_sell>"
            diff_date date_buy date_sell seconds_diff minutes_diff hours_diff
            printf "%02d:%02d:%02d\n" "$hours_diff" "$minutes_diff" "$seconds_diff"
        ;;
    esac
done < "$input_filename"

和:

chmod +x ./data-diff-records.sh

像这样使用它(records.log输入文件在哪里):

./data-diff-records.sh records.log

相关内容