특정 시작 문자가 포함된 값의 Grep 범위

특정 시작 문자가 포함된 값의 Grep 범위

특정 텍스트(예: TY[0-9])의 발생 횟수를 계산하려는 10GB 파일이 있습니다.

예시 파일:

ABC,2A,2018-07-06,2018-06-20 00:00:00
BCD,TY1,2018-07-06,2018-06-20 00:00:00
EFG,TY2,2018-07-06,2018-06-20 00:00:00
IGH,2A,2018-07-06,2018-06-20 00:00:00

TY숫자로 시작하는 모든 텍스트의 수를 얻고 싶습니다 . egrep을 사용해 보았지만 올바른 결과를 얻지 못했습니다.

egrep  "^TY[0-9]" Filename

답변1

시도한 솔루션의 주요 문제점은 TY문자열의 시작 부분(표현식을 고정하는 위치 ^)에서 찌르는 소리가 발생한다고 가정한다는 것입니다. 두 번째 쉼표로 구분된 필드의 시작 부분에 나타납니다.


awk파일에서 두 번째 쉼표로 구분된 필드가 문자열과 숫자로 시작되는 횟수를 계산 하는 데 사용됩니다 TY.

awk -F, '$2 ~ /^TY[[:digit:]]/ { n++ } END { print n }' filename

cut와 함께 사용하는 것이 더 빠른지 궁금합니다 grep. 두 번째 열을 제거하면 처리할 데이터가 적어지므로 단독으로 수행하는 것보다 속도가 더 빠를 grep수 있습니다 .grep

cut -d, -f2 filename | grep -c '^TY[[:digit:]]'

...하지만 잘 모르겠습니다.


내 OpenBSD 시스템에서 1.1GB 파일로 일부 테스트한 결과 +는 실제로 cut(8초 대 15초)보다 grep거의 50% 더 빨랐습니다 . awk그리고 순수 grep용액( grep -Ec '\<TY[0-9]' filename, 에서 가져옴글렌의 솔루션) 13초가 소요됩니다.

따라서 두 번째 필드에서 문자열을 선택하는 경우 일치하기 전에 해당 필드를 추출하면 시간을 절약할 수 있습니다.

답변2

줄 시작 앵커 대신 단어 경계를 사용하고 싶습니다.

$ grep -Ec '\<TY[0-9]' file
2

참고: 이것은 모두 중요합니다.철사"TY"로. 모든 "TY 단어"의 개수가 아닙니다. 한 줄에 두 개 이상 있을 수 있는 경우

$ grep -Eo '\<TY[0-9]' file | wc -l

답변3

,TY임의의 소수 자릿수로 시작하고 그 뒤에 해당 숫자가 오는 구분된 필드를 찾으려면 다음을 수행할 수 있습니다.

<file perl -lne '$n += () = /(?<![^,])TY\d+(?![^,])/g; END{print 0+$n}'

다음을 입력:

TY1,TY2,TY,TYFOO
TY213,X-TY2,TY4

4( TY1, TY2, TY213, ) 를 반환합니다 TY4.

(?<!...)(?!...)각각 음의 뒤돌아보기 및 미리보기 연산자입니다. 따라서 여기서는 앞이나 뒤에 예외 문자가 없는 경우 TY하나 이상의 ( +) 숫자 ( ) 뒤에 하나 이상의 ( ) 숫자 ( ) 가 오는 것을 찾습니다 .\d,

또 다른 접근 방식은 s를 개행 문자로 변환하고 하나 이상의 숫자로 시작하는 ,결과 줄 수를 계산하는 것입니다.TY

<file tr , '\n' | LC_ALL=C grep -xEc 'TY[[:digit:]]+'

(내 시스템에서는 이것이 솔루션의 약 10배입니다 perl)

관련 정보