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 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

관련 정보