,
다음 명령으로 구분된 열 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
@b
subst
-
$date
DateTime
2022-05-05T12:00:12Z
DateTime
Instant
push
@b
Instant
loop
입력 예 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