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

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

누락된 줄을 찾기 위해 특정 열에서 "일련 번호"(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로 재설정됩니다. 이 시점에서 5열에 1이 추가되었습니다.

정리된 출력은 파일 끝까지만 반복됩니다. 손실된 데이터를 어떻게 찾을 수 있나요?

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
[...]

관련 정보