![데이터 파일에서 누락된 일련 번호 찾기](https://rvso.com/image/97231/%EB%8D%B0%EC%9D%B4%ED%84%B0%20%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EB%88%84%EB%9D%BD%EB%90%9C%20%EC%9D%BC%EB%A0%A8%20%EB%B2%88%ED%98%B8%20%EC%B0%BE%EA%B8%B0.png)
누락된 행을 찾기 위해 특정 열에 '순차 번호'(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
[...]