서로 다른 파일 간의 시차 계산

서로 다른 파일 간의 시차 계산

매우 큰 로그 파일이 있고 시작 및 종료 시간을 호출해야 합니다.

Bigfile.txt:

2021-02-24 14:21:34,630;START
2021-02-24 14:21:35,529;END  
2021-02-24 14:57:05,600;START
2021-02-24 14:57:06,928;END  
2021-02-24 15:46:45,894;START
2021-02-24 15:46:46,762;END  
2021-02-24 17:49:20,925;START
2021-02-24 17:49:26,243;END  
2021-02-24 18:32:18,166;START
2021-02-24 18:32:18,969;END  

이 형식으로 세 번째 파일을 생성해야 합니다(START(대형 파일의 1행), END(대형 파일의 2행), Duration(초 단위로 보고된 차이)의 3개 열로 구성됨).

Outputfile.txt:

2021-02-24 14:21:34,630;2021-02-24 14:21:35,529;0,899
2021-02-24 14:57:05,600;2021-02-24 14:57:06,928;1,328

전체 파일에 대해. 누구든지 나를 도와줄 수 있나요? Bash 스크립트를 통해 작동하도록 어떻게 설정합니까? 누군가 나에게도 설명해 줄 수 있다면 :D

모든 지원에 미리 감사드립니다.

답변1

나는 GNU에 대해 다음과 같은 제안을 합니다 awk:

awk -F'[,;]' \
  # odd lines (START)
  'NR%2 == 1 {
    # set a to date an miliseconds
    a = $1","$2
    # set d1 to date replacing - and : for spaces
    d1 = gensub(/[-:]/," ","g",$1)
    # set m1 to miliseconds
    m1 = $2 
  } 
  # even lines (END)
  NR%2 == 0 {
    OFS=";"
    # the same as before...
    b = $1","$2
    d2 = gensub(/[-:]/," ","g",$1)
    m2 = $2
    # set c and d to seconds and miliseconds
    c = mktime(d2)"."m2
    d = mktime(d1)"."m1
    # print
    print a, b, c-d
  }' file

산출:

2021-02-24 14:21:34,630;2021-02-24 14:21:35,529;0.899
2021-02-24 14:57:05,600;2021-02-24 14:57:06,928;1.328
2021-02-24 15:46:45,894;2021-02-24 15:46:46,762;0.868
2021-02-24 17:49:20,925;2021-02-24 17:49:26,243;5.318
2021-02-24 18:32:18,166;2021-02-24 18:32:18,969;0.803

답변2

일방 bash통행. 당신은 그것이 작동하도록해야합니다 bc.

#!/bin/bash

# For each line of the file
while read line; do
    if [ "${line#*;}" = "START" ]; then
        # We are in a start record
        # Save the whole line less the START token 
        whole_start="${line%;*}"

        # Get the start time as : sec,ms
        start_time="${whole_start##*:}"
        
        # swap , with . for bc
        start_time="${start_time/,/.}"

        # ... And go to the next round
        continue

    else
        # We are in the END round, do the same
        whole_end="${line%;*}"
        end_time="${whole_end##*:}"
        end_time="${end_time/,/.}"
    fi

    # Obtain the ms and add the leading 0 if it miss
    ms_diff=`echo "scale=3; $end_time - $start_time" | bc | sed '/^\./ s/.*$/0&/'`

    echo "$whole_start;$whole_end;$ms_diff"
done < ./your_file.csv

출력을 파일로 리디렉션하면 원하는 결과를 얻을 수 있습니다.

2021-02-24 14:21:34,630;2021-02-24 14:21:35,529;0.899
2021-02-24 14:57:05,600;2021-02-24 14:57:06,928;1.328
2021-02-24 15:46:45,894;2021-02-24 15:46:46,762;0.868
2021-02-24 17:49:20,925;2021-02-24 17:49:26,243;5.318
2021-02-24 18:32:18,166;2021-02-24 18:32:18,969;0.803

관련 정보