누락된 줄을 찾기 위해 특정 열에서 "일련 번호"(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
[...]