我有一个文件,其中包含以下买卖事件的示例记录
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 dconv
(dateutils.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