데이터 파일에서 누락된 일련 번호 찾기

데이터 파일에서 누락된 일련 번호 찾기

누락된 행을 찾기 위해 특정 열에 '순차 번호'(16 이후 재설정)가 있는 대용량 파일을 어떻게 검색할 수 있습니까?

데이터 파일이 있습니다.

col1 col2 col3 col4 col5 1
col1 col2 col3 col4 col5 2
.
.
.
col1 col2 col3 col4 col5 15
col1 col2 col3 col4 col5 16
col1 col2 col3 col4 col5+1 1

마지막 열은 1부터 16까지 계산된 다음 다시 1로 재설정됩니다. 이 시점에서 1이 열 5에 추가됩니다.

깨끗한 출력은 파일 끝까지 반복됩니다. 누락된 데이터를 어떻게 찾을 수 있나요?

col1 col2 col3 col4 col5 1
col1 col2 col3 col4 col5 3

값 2를 건너뛴 마지막 열에서 볼 수 있듯이 행을 건너뛰거나 손실한 곳은 어디입니까?

원하는 출력으로 누락된 데이터 전후의 줄 번호/줄 위치를 원합니다.

스택 오버플로에 대한 이 답변나에게 사용할 아이디어를 주었다 awk. 그래서 제가 생각해낸 것은 다음과 같습니다.

awk '$6!=p+1{print NR}{p=$6}'

현재 줄의 열 6이 마지막 줄의 열 6과 같지 않을 때 현재 줄 번호를 인쇄하려고 합니다. +1. 이는 16에 도달하고 1로 돌아가는 반복 특성으로 인해 실패합니다.

답변1

$ cat -n file
 1  col1 col2 col3 col4 col5 14
 2  col1 col2 col3 col4 col5 15
 3  col1 col2 col3 col4 col5 16
 4  col1 col2 col3 col4 col5 1
 5  col1 col2 col3 col4 col5 2
 6  col1 col2 col3 col4 col5 15
 7  col1 col2 col3 col4 col5 16
 8  col1 col2 col3 col4 col5 4
 9  col1 col2 col3 col4 col5 5

$ awk '{if (p % 16 + 1 != $6) printf("line %d is bad: %s\n", NR, $0); p=$6}' file
line 1 is bad: col1 col2 col3 col4 col5 14
line 6 is bad: col1 col2 col3 col4 col5 15
line 8 is bad: col1 col2 col3 col4 col5 4

모듈로 연산자 "%"(나누기 나머지)의 값을 이해하려면 다음 awk 스니펫을 사용해 볼 수 있습니다.

$ yes | head -n 40 | awk '{x=NR-1; print x, "->", x % 16}'
0 -> 0
1 -> 1
2 -> 2
[...]
14 -> 14
15 -> 15
16 -> 0
17 -> 1
18 -> 2
[...]

관련 정보