타임스탬프가 있는 텍스트 파일을 처리하고 매초 마지막 줄을 출력합니다.

타임스탬프가 있는 텍스트 파일을 처리하고 매초 마지막 줄을 출력합니다.

"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로 바꿀 수 있습니다.tactail -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의 주요 기능 쌍에서 첫 번째 문자열을 제거할 뿐만 아니라 버퍼에 남아 있는 문자열을 사용하여 스크립트 시작 부분에서 작업을 다시 시작합니다.

관련 정보