제목에서 알 수 있듯이 현재 $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