
"YYYY-MM-DDTHH:MM:SS.fffffffffZ"
일부 데이터가 뒤따르는 형식의 나노초 해상도 타임스탬프가 포함된 csv 파일이 있습니다.
2021-04-26T09:30:04.786235633Z,102
2021-04-26T09:30:04.786235633Z,524
2021-04-26T09:30:04.786235633Z,566
2021-04-26T09:30:04.791050014Z,391
2021-04-26T09:30:09.882687589Z,922
2021-04-26T09:30:09.886405549Z,744
2021-04-26T09:30:09.886405549Z,702
2021-04-26T09:30:14.986237837Z,436
2021-04-26T09:30:14.986237837Z,636
2021-04-26T09:30:14.986298532Z,353
2021-04-26T09:30:14.986298532Z,445
2021-04-26T09:30:14.986298532Z,785
2021-04-26T09:30:14.986298532Z,917
2021-04-26T09:30:20.086229659Z,195
2021-04-26T09:30:20.086229659Z,228
2021-04-26T09:30:20.086229659Z,486
2021-04-26T09:30:20.086229659Z,41
2021-04-26T09:30:20.086229659Z,421
2021-04-26T09:30:20.090214746Z,386
2021-04-26T09:30:25.186477272Z,678
2021-04-26T09:30:25.186477272Z,198
2021-04-26T09:30:25.190264104Z,459
2021-04-26T09:30:25.190460283Z,123
2021-04-26T09:30:25.190460283Z,318
2021-04-26T09:30:26.442994013Z,200
나는 그것을 그런 식으로 처리하고 싶다.초당 마지막 줄출력은 다음과 같습니다.
2021-04-26T09:30:04.791050014Z,391
2021-04-26T09:30:09.886405549Z,702
2021-04-26T09:30:14.986298532Z,917
2021-04-26T09:30:20.090214746Z,386
2021-04-26T09:30:25.190460283Z,318
2021-04-26T09:30:26.442994013Z,200
awk나 유사한 도구를 사용하여 이 작업을 수행할 수 있습니까?
답변1
GNU를 사용하면 sort
다음과 같은 작업을 수행할 수 있습니다.
<file.csv sort -r | sort -suk1,1.19
즉, sort
결과를 역순으로 정렬하지만 처음 19자만 고려하여 하위 초를 무시하고 (고유한 경우) 첫 번째 문자( -u
이전 및 안정적인 새 문자로 인해 더 큰 문자가 됨) 순서를 선택하는 데 사용합니다. ) 동일한 19자 키를 가진 것입니다.sort
-s
또한 첫 번째 행 앞의 행 부분을 정렬 키로 선택할 -k1,1.19
수도 있습니다 .-t. -k1,1
.
입력 파일이 이미 시간순으로 정렬되어 있는 경우 첫 번째 파일을 (또는 일부 시스템에서는) sort
로 바꿀 수 있습니다.tac
tail -r
답변2
예, 가능합니다. 마지막 초와 해당 행을 추적하고 두 번째가 변경될 때마다 기억된 행을 출력합니다.
awk -F. 'NR > 1 && lastsec != $1 { print lastline }
{ lastsec = $1; lastline = $0 }
END { if (NR) print }'
답변3
사용파이썬groupby
모듈 의 메소드를 결합합니다 itertools
.
그룹화는 시간(0번째 필드)에 수행되며 그룹에서 마지막 요소는 그룹의 대상 행입니다.
python3 -c 'import itertools as it, sys
fs,rs = ofs,ors = ".","\n"
with open(sys.argv[1]) as f:
print(*[list(group)[-1].rstrip(rs) for key,group in it.groupby(f,lambda x: x.split(fs)[0]) if key],sep=ors)
' file
스트림 편집기 sed는 다음과 같이 이를 처리할 수 있습니다.
sed -Ee '
$!N
/^([^.]+\.).*\n\1/!P
D
' file
기본적으로 두 개의 연속 라인, 특히 점으로 구분된 첫 번째 필드를 비교합니다. 일치하지 않는 경우에만 인쇄됩니다.
답변4
sed 'N;/^\([^.]*\.\).*\n\1/D;P;D' file
명령 D의 주요 기능 쌍에서 첫 번째 문자열을 제거할 뿐만 아니라 버퍼에 남아 있는 문자열을 사용하여 스크립트 시작 부분에서 작업을 다시 시작합니다.