awk를 사용하여 이전 행의 $3 값이 동일한 경우 현재 행을 어떻게 삭제할 수 있습니까?

awk를 사용하여 이전 행의 $3 값이 동일한 경우 현재 행을 어떻게 삭제할 수 있습니까?

제목에서 알 수 있듯이 현재 $3를 이전 행의 $3와 비교하고 같으면 현재 행을 삭제하려면 어떻게 해야 합니까?

예를 들어 이 파일

100.824 4 Packet to 
101.027 1 Received  
102.23 1 Received  
229.393 4 Packet to
229.605 1 Received 

~이 되다

100.824 4 Packet to 
101.027 1 Received  
229.393 4 Packet to
229.605 1 Received 

답변1

"현재 줄을 삭제"하려면 인쇄하지 마세요.

따라서 당신이 해야 할 일은 세 번째 필드인 경우에만 현재 행을 인쇄하는 것입니다.은 다르다이전 행의 세 번째 필드입니다.

이를 위해서는 다음 행의 세 번째 필드와 비교할 수 있도록 세 번째 필드를 변수에 저장해야 합니다.

awk 'NR == 1 || $3 != prev; { prev = $3 }' file

그러면 첫 번째 행과 세 번째 필드가 의 값과 다른 모든 행이 무조건 인쇄됩니다 prev. 이는 다음과 같습니다.

awk 'NR == 1 || $3 != prev { print $0 } { prev = $3 }' file

그러나 우리가 사용하는 것은 조건부 테스트가 평가될 때의 기본 동작이 다음과 같이 평가된다는 사실입니다.진짜, 현재 줄을 인쇄하는 것입니다.

출력이 발생하거나 발생하지 않으면 prev다음 행을 처리할 때 사용하기 위해 현재 행의 세 번째 필드로 설정됩니다.

예:

$ cat file
1 2 3
1 2 3
a b c
d e f
1 2 3
1 2 3
$ awk 'NR == 1 || $3 != prev; { prev = $3 }' file
1 2 3
a b c
d e f
1 2 3

예제 파일이 주어지면 이 awk스크립트는 다음을 생성합니다.

100.824 4 Packet to
101.027 1 Received
229.393 4 Packet to
229.605 1 Received

첫 번째 행의 세 번째 필드가 다음과 같은지 확인할 수 있는 경우항상 비어 있지 않음, 그러면 awk명령을 다음과 같이 단순화 할 수 있습니다.

awk '$3 != prev; { prev = $3 }' file

관련 정보