다음 구매 및 판매 이벤트에 대한 샘플 기록이 포함된 파일이 있습니다.
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 Date를 사용할 수도 있습니다.
답변1
dateutils dconv
( dateutils.dconv
데비안 파생 시스템에서 호출됨)에는 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가 있다고 가정합니다.
이렇게 하면 날짜에서 원하지 않는 부분을 잘라낸 다음 날짜를 epoch(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