
현재 배치 스크립트를 작성하려고 하는데 이 시점에서 "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>