awk를 사용하여 열 번호로 쿼리하는 방법

awk를 사용하여 열 번호로 쿼리하는 방법

,다음 명령으로 구분된 열 2의 시차를 얻고 싶습니다 . 기본적으로 첫 번째 열은 정상적으로 작동합니다.

테이블:

20220505,12:00:12,user,dept
20220505,12:00:25,user,dept
20220505,12:00:32,user,dept

주문하다:

awk -F: '{t=$1*3600+$2*60+$3} NR>1{printf( "%.6f\n", t-p)}{p=t}' inputfile

시도했지만 올바른 결과를 얻지 못했습니다.

awk -F ',' $2 '{t=$1*3600+$2*60+$3} NR>1{printf( "%.6f\n", t-p)}{p=t}' inputfile

답변1

awk에게 사용하라고 알려줘야 합니다둘 다 ,그리고 :필드 구분 기호로 사용됩니다. 이렇게 하면 필드 번호가 변경됩니다(두 필드 구분 기호가 각 입력 줄에 적용되므로). 예를 들어:

$ awk -F '[:,]' '{ t = $2*3600 + $3*60 + $4 }
                 NR > 1 { printf "%.6f\n", t-p }
                 { p=t }' inputfile
13.000000
7.000000

이는 서로 다른 날짜 간의 시차를 계산하지 않는다는 점에 유의하세요. 이렇게 하려면 결합된 날짜와 시간을 단일 time_t값(즉, 신기원(1970년 1월 1일 자정) 이후의 초 수)으로 구문 분석해야 합니다. 예를 들어,암소 비슷한 일종의 영양awk, 다음 mktime()기능을 사용합니다.

$ awk -F '[:,]' '{
                    # extract the year, month, and day from the first field
                    y = substr($1,1,4);
                    m = substr($1,5,2);
                    d = substr($1,7,2);
                    # create a space-separated datespec string, combining y,m,d with
                    # hours, minutes, and seconds from fields 2, 3, and 4
                    datespec = y " " m " " d " " $2 " " $3 " " $4;
                    # convert it to seconds since the epoch
                    t = mktime(datespec)
                  }
                  NR > 1 { printf "%.6f\n", t-p }
                  { p=t }' inputfile
13.000000
7.000000

이 기능의 작동 방식에 대한 요약을 실행 man awk하고 검색하세요 .mktime

답변2

사용행복하다(이전 Perl_6)

raku -e 'my @a = lines.map: *.split(",");  my @b; for ^@a.elems -> $i {  \
         my $date = @a[$i][0].subst(/ ^ (\d**4)(\d**2)(\d**2) $/, {"$0-$1-$2"});  \
         @b.push: "{$date}T@a[$i][1]Z".DateTime.Instant };  \
         loop (my $i = 0; $i < @b.elems-1; $i++) { put @b[$i+1] - @b[$i] };'

Raku는 날짜와 시간을 처리하기 위해 다음 방법을 사용합니다.ISO 8601 교환 표준, 내장. 첫 번째 명령문에서는 각각을 lines쉼표로 읽고 배열에 저장합니다. 배열이 선언되었습니다. 그런 다음 행이 반복되고 첫 번째 열(날짜)의 요소가 하이픈으로 구분되어 생성되며 해당 문자열은 ISO 8601과 같은 것을 생성하는 데 사용됩니다. 이는 즉시 객체로(초 단위로) 변환되어 배열에 추가됩니다. 마지막 문에서는 초가 반복되어 서로 뺍니다.split","@a@bsubst-$dateDateTime2022-05-05T12:00:12ZDateTimeInstantpush@bInstantloop

입력 예 1:

20220505,12:00:12,user,dept
20220505,12:00:25,user,dept
20220505,12:00:32,user,dept

예제 출력 1:

13
7

날짜와 시간을 사용하면 다음과 같은 이점이 있습니다 ISO 8601. 한 날짜에서 다음 날짜까지의 타임스탬프를 올바르게 처리합니다.

입력 예 2:

20220505,23:59:45,user,dept
20220506,00:00:00,user,dept
20220506,00:00:15,user,dept

예제 출력 2:

15
15

https://en.wikipedia.org/wiki/ISO_8601
https://docs.raku.org/언어/temporal#index-entry-Date_and_time_functions
https://raku.org

관련 정보