No Windows, existe uma maneira de contar quantas vezes uma string aparece em um arquivo?

No Windows, existe uma maneira de contar quantas vezes uma string aparece em um arquivo?

Atualmente, estou tentando escrever um script em lote e, neste momento, preciso encontrar uma string, "null", e determinar quantas vezes ela é mostrada no arquivo.

Estou baixando uma API de um site toda vez que o script é iniciado e dentro da API eles têm "nulo" de vez em quando. Quando a API deles é baixada, ela é baixada em uma única linha e estou tentando isso:

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

Mas isso exibe apenas "1" porque o arquivo tem apenas 1 linha.

Existe alguma outra maneira de gerar a quantidade de vezes que "null" está no arquivo?

adicionado por barlop
OP também acabou de mencionar que não pode instalar software de terceiros.

Responder1

Tenho que acreditar que isso já foi perguntado e respondido antes. Mas aqui está um script em lote simples que pode fazer o trabalho.

::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

O uso da linha de comando seria

StringCount null yourFile.txt

Isso pode ficar bastante lento com arquivos grandes.


Eu escrevi umutilitário híbrido JScript/lote chamado REPL.BATisso pode tornar o trabalho fácil e deve ser bastante rápido. O utilitário realiza uma pesquisa regex e substitui as linhas lidas em stdin e grava o resultado em stdout. Possui um bom número de opções, incluindo opções que simplificam esta tarefa. O utilitário é um script puro que será executado em qualquer máquina Windows moderna a partir do XP. A documentação completa está incorporada no script.

Veja como ele pode ser usado para resolver seu problema, assumindo que a pesquisa sejamaiúsculas e minúsculas.

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

Se você quiser que a pesquisa sejasem distinção entre maiúsculas e minúsculas

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

Responder2

Você tem a opção de baixar um único executável?

O que você precisa é de um utilitário bem portado grep.
por exemplo, grep (GNU grep) 2.16

A opção que você deseja é -cou --count.

De acordo com o comentário de @dbenham abaixo, a maneira de contar não apenas linhas com 'nulo', mas também múltiplas instâncias POR LINHA é:

grep -o arquivo nulo para leitura.txt | grep -c 

Responder3

Esta não é uma abordagem muito purista. Requer que você obtenha o gnuwin32 com os pacotes coreutils e grep.

Se alguém puder fazer isso com lote puro, melhor em certo sentido.

Mas grep e wc são a maneira GNU/linux que você pode fazer no Windows.

copy con aa <-- cria o arquivo aa. Observe que tem a string rrr 3 vezes.

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

(o -o on grep -o é importante para não retornar a linha inteira. E isso é particularmente importante porque se rrr ocorrer muitas vezes em uma linha, você não deseja que ele exiba rrr apenas uma vez para essa linha. grep -o obtém cada ocorrência de rrr em uma nova linha. O número total de linhas é então o número total de ocorrências.

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

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

C:\blah>

informação relacionada