일치하는 패턴의 총 수를 인쇄합니다.

일치하는 패턴의 총 수를 인쇄합니다.

저는 API를 사용하여 약 10억 개의 레코드를 얻은 다음 필터링 awk하고 파이프를 통해 wc -l레코드 수를 계산합니다. 나는 현재 이 일을 성공적으로 하고 있습니다:

$apiCall | awk '$1=="xx"' | wc -l > file

wc -l하지만 AWK 명령을 결합하면 다음과 같이 파이핑하는 것보다 계산 소모가 덜할 것 같습니다 .

$apiCall | awk '$1=="xx" && END{print NR}' > file

그러나 이것은 작동하지 않습니다.

답변1

다음을 찾을 수 있습니다.

LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)'

awk고급 언어를 해석하는 오버헤드를 방지하므로 훨씬 빠릅니다.

LC_ALL=C우리는 텍스트 해석을 단순화하기 위해 사용합니다 . 이는 또한 SPC와 TAB만이 구분 기호로 이해된다는 것을 의미하지만 awk이는 로케일에 관계없이 많은 구현에 해당됩니다.

GNU/Linux amd64 멀티 코어 시스템의 일부 타이밍은 다음과 같습니다 zsh.

$ (repeat 3000 printf '%s\n' {{,xx}{1..1000},xx}" blah blah blah")> a
$ wc a
  6003000  24012000 119412000 a
$ time LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)' < a
3000
LC_ALL=C grep -Ec '^[[:blank:]]*xx([[:blank:]]|$)' < a  0.15s user 0.03s system 99% cpu 0.175 total
$ time gawk '$1=="xx"{n++};END{print n}' < a
3000
gawk '$1=="xx"{n++};END{print n}' < a  2.00s user 0.05s system 99% cpu 2.055 total
$ time LC_ALL=C gawk '$1=="xx"{n++};END{print n}' < a
3000
LC_ALL=C gawk '$1=="xx"{n++};END{print n}' < a  1.96s user 0.03s system 99% cpu 1.985 total
$ time mawk '$1=="xx"{n++};END{print n}' < a
3000
mawk '$1=="xx"{n++};END{print n}' < a  1.23s user 0.04s system 99% cpu 1.277 total
$ time gawk '$1=="xx"' < a | wc -l
3000
gawk '$1=="xx"' < a  1.91s user 0.05s system 99% cpu 1.967 total
wc -l  0.00s user 0.00s system 0% cpu 1.967 total

답변2

아이디어는 정확하지만 올바른 구문은 awk다음과 같습니다.

$apiCall | awk '$1=="xx"{ count++ }END{ print count }'

awk를 기반 으로 하기 때문에 pattern { action }첫 번째 열의 패턴과 일치하면 xx발생할 때마다 카운터를 증가시키는 작업의 일부를 수행하고 파일 처리가 끝나면 END절에서 최종 개수를 인쇄합니다. > file필요에 따라 출력을 마지막에 파일로 리디렉션합니다.

관련 정보