파일에서 패턴을 검색하는 동안 awk 문 중단

파일에서 패턴을 검색하는 동안 awk 문 중단

33GB 파일이 있습니다. 이 파일에서 첫 번째 열은 국가 코드입니다(예: AT, BE, CA, DE, DK, GB, IE, IT 등). 다음과 같이 awk 명령을 사용하고 있습니다.

awk -F"|" '$1~/^AT/ {print $0}'

이 명령은 잘 작동합니다. 그러나 awk가 전체 파일을 읽는 데 거의 1.5시간이 걸립니다.

검색 패턴이 완료되면 awk 명령을 중단하는 방법이 있습니까?

예: AT 검색이 끝나면 파일의 나머지 부분 검색을 중지해야 합니다.

작업 중인 파일이 정렬되어 있습니다.

답변1

파일의 다음 코드를 알고 있는 경우

awk '/^BE/ { exit }; /^AT/' file

또한 이 -F옵션은 격리된 시나리오에서는 실제로 유용하지 않으며 { print $0 }원하는 특정 작업인 경우 기본 작업을 명시적으로 제공할 필요가 없습니다.

이 작업을 반복적으로 수행해야 하는 경우 단일 스크립트를 사용하여 원본 파일을 한 번에 구분하려는 파일 부분을 추출하는 것이 더 효율적입니다. 전체(또는 주요 부분)를 추출하려는 경우도 참조하세요. csplit(모두 추출한 후 원하지 않는 파일을 삭제할까요?)

답변2

파일이 정렬되어 있으므로 문자열 비교를 사용하여 찾고 있는 필드 다음에 첫 번째 필드가 정렬되는 시점을 알아낼 수 있습니다.

awk -F"|" '$1 ~ /^AT/ {print $0} $1 > "AT" {exit}'

물론 이렇게 해도 알파벳 뒷부분에 있는 코드의 첫 번째 항목을 더 빨리 찾을 수는 없으므로 더 복잡한 작업에는 적절한 색인을 사용하는 것을 고려하는 것이 좋습니다.

답변3

물론 다음을 추가하세요 exit.

awk -F"|" '$1~/^AT/ {print $0; exit}'

이렇게 하면 첫 번째 필드가 로 시작하는 첫 번째 행을 찾는 즉시 종료됩니다 AT. 첫 번째 필드의 첫 번째 행을 찾는 즉시 중지하려면아니요처음부터 다음을 AT사용할 수 있습니다.

awk -F"|" '{if($1~/^AT/){print $0}else{exit}}' 

줄이 첫 번째 줄 앞에서 시작하지 않고 다음으로 시작하는 줄을 인쇄한 후 중지 AT하려면 다음을 사용하세요.AT

awk -F"|" '{if($1~/^AT/){print $0; a=1}else if(a==1){exit}}'  

관련 정보