마지막 필드를 기준으로 Uniq, 마지막 행 유지, 중복 항목 수 추가

마지막 필드를 기준으로 Uniq, 마지막 행 유지, 중복 항목 수 추가

다음 논리를 구현하려면 bash 스크립트에서 awk 명령을 구현하는 데 도움이 필요합니다. 정렬/고유 조합을 시도했지만 성공하지 못했습니다.

아래와 같이 타임스탬프와 일부 숫자가 포함된 긴 목록이 있습니다.

[2020-09-15 09:03:21.835335] 1021
[2020-09-15 09:03:21.935335] 1021
[2020-09-15 09:03:22.835335] 1022
[2020-09-15 09:03:25.835335] 1022
[2020-09-15 09:04:21.835335] 1023
[2020-09-15 09:05:21.835335] 1023
[2020-09-15 09:04:22.835335] 1023
[2020-09-15 09:05:23.835335] 1023

최종 결과에서는 위의 2열에 있는 목록을 수치적으로 처리하고 싶습니다. 최종 처리된 데이터에서 2번 열의 고유 번호(한 번만 발생하더라도)를 계산하고 해당 번호 앞의 새 열에 추가하고 싶습니다. 실제로 필요한 것은 숫자 열에서 중복/고유 항목이 마지막으로 발생한 타임스탬프입니다.

[2020-09-15 09:03:21.935335] 1021 2
[2020-09-15 09:03:25.835335] 1022 2
[2020-09-15 09:05:23.835335] 1023 4

어떤 도움이라도 대단히 감사하겠습니다!

감사해요!

답변1

tac file | uniq -c -f 2 | awk '{$(NF+1)=$1;$1=""}1' | tac

tac파일을 역순으로 인쇄합니다. 이는 마지막으로 발생한 중복 행이 유지되도록 하기 위한 것입니다.

uniq -c -f 2처음 두 필드를 건너뛰고 마지막 필드만 비교합니다 -f 2. -c중복 행 수 앞에 플래그를 추가하므로 개수를 마지막 필드로 전송해야 합니다. 그게 다야 awk '{$(NF+1)=$1;$1=""}1'.

마지막으로 tac모든 것을 원래 상태로 복원합니다.

 [2020-09-15 09:03:21.935335] 1021 2
 [2020-09-15 09:03:25.835335] 1022 2
 [2020-09-15 09:05:23.835335] 1023 4

답변2

$ awk '{map[$3]=$1" "$2; cnt[$3]++} END{for (key in map) print map[key], key, cnt[key]}' file
[2020-09-15 09:03:21.935335] 1021 2
[2020-09-15 09:03:25.835335] 1022 2
[2020-09-15 09:05:23.835335] 1023 4

위의 내용은 라인을 무작위 순서로 출력하므로 입력 순서를 유지해야 하는 경우 약간의 조정이 필요합니다.

관련 정보