Windows에서 파일에 문자열이 나타나는 횟수를 계산하는 방법이 있습니까?

Windows에서 파일에 문자열이 나타나는 횟수를 계산하는 방법이 있습니까?

현재 배치 스크립트를 작성하려고 하는데 이 시점에서 "null"이라는 문자열을 찾아서 파일에 표시되는 횟수를 결정해야 합니다.

스크립트가 시작될 때마다 웹사이트에서 API를 다운로드하고 있는데 API 내에서 때때로 "null"이 발생합니다. API가 다운로드되면 한 줄로 다운로드되며 다음과 같이 시도했습니다.

findstr /C:"null" %TEMP%\$SELECT%.txt | find /C "null" > $TEMP$\$SELECT$-status.txt

그러나 파일 길이가 1줄이므로 "1"만 표시됩니다.

파일에 "null"이 있는 횟수를 출력하는 다른 방법이 있습니까?

barlop님이 추가함
OP는 또한 타사 소프트웨어를 설치할 수 없다고 언급했습니다.

답변1

나는 이것이 이전에 질문되고 대답되었다고 믿어야 합니다. 하지만 여기에 작업을 수행할 수 있는 간단한 배치 스크립트가 있습니다.

::StringCount String File
::
::  Count the number of times that String appears in File.
::  The search is not case sensitive.
::  Enclosing quotes are not considered to be part of the string.
::  The string cannot contain =
::
@echo off
setlocal disableDelayedExpansion
set count=0
for /f usebackq^ delims^=^ eol^= %%A in (%2) do set "ln=%%A"&call :testLine %1
echo %count%
exit /b

:testLine
setlocal enableDelayedExpansion
:testLine2
if defined ln if "!ln:*%~1=!" neq "!ln!" (
  set /a count+=1
  set "ln=!ln:*%~1=!"
  goto testLine2
)
endlocal & set /a count=%count%
exit /b

명령줄 사용법은 다음과 같습니다.

StringCount null yourFile.txt

대용량 파일의 경우 상당히 느려질 수 있습니다.


나는 다음을 썼다.REPL.BAT라는 하이브리드 JScript/배치 유틸리티그러면 작업이 쉬워지고 상당히 빨라질 것입니다. 유틸리티는 stdin에서 읽은 행에서 정규식 검색 및 바꾸기를 수행하고 결과를 stdout에 기록합니다. 이 작업을 단순화하는 옵션을 포함하여 상당히 많은 옵션이 있습니다. 이 유틸리티는 XP 이후의 모든 최신 Windows 시스템에서 실행되는 순수 스크립트입니다. 전체 문서가 스크립트 내에 포함되어 있습니다.

검색이 다음과 같다고 가정하고 문제를 해결하는 데 사용할 수 있는 방법은 다음과 같습니다.대소문자 구분.

<yourFile.txt repl (null) \n$1\n ax | find /c "null"

검색을 원하시면대소문자를 구분하지 않음

<yourFile.txt repl (null) \n$1\n aix | find /i /c "null"

답변2

단일 실행 파일을 다운로드할 수 있는 옵션이 있습니까?

필요한 것은 잘 이식된 grep유틸리티입니다.
예: grep(GNU grep) 2.16

원하는 옵션은 -c또는 입니다 --count.

아래 @dbenham의 의견에 따라 실제로 'null'이 있는 줄뿐만 아니라 LINE당 여러 인스턴스도 계산하는 방법은 다음과 같습니다.

grep -o null file-to-read.txt | grep -c 

답변3

이것은 매우 순수주의적인 접근 방식이 아닙니다. coreutils 및 grep 패키지와 함께 gnuwin32를 가져와야 합니다.

누군가 순수 배치로 이를 수행할 수 있다면 어떤 의미에서는 더 좋습니다.

하지만 grep과 wc는 Windows에서 수행할 수 있는 GNU/Linux 방식입니다.

copy con aa <-- aa 파일을 생성합니다. rrr 문자열이 3번 있다는 점에 주목하세요.

C:\blah>copy con a.a
sdfsdfsdfsrrrsdfsdfsdfdrrrsdfsdf
dsfsdfsddsd
sdfsdfsdjsdjksdjklsdjlksdrrr^Z
        1 file(s) copied.

(grep -o의 -o는 중요하므로 전체 라인을 반환하지 않습니다. 그리고 이는 rrr이 한 라인에서 여러 번 발생하는 경우 해당 라인에 대해 rrr을 한 번만 표시하는 것을 원하지 않기 때문에 특히 중요합니다. grep -o는 새 줄에서 rrr이 발생할 때마다 총 줄 수를 가져옵니다.

C:\blah>grep -o rrr a.a
rrr
rrr
rrr

C:\blah>grep -o rrr a.a | wc -l
3

C:\blah>

관련 정보