특정 텍스트(예: 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
)