No Windows, existe uma maneira de contar a quantidade de vezes que uma string aparece em um arquivo

2

No momento, 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 é baixada, ela é baixada para uma única linha e eu estou tentando isso:

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

Mas isso só exibe um "1" porque o arquivo tem apenas 1 linha de comprimento.

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

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

    
por user347636 18.07.2014 / 14:56

3 respostas

2

Eu tenho que acreditar que isso 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 muito lento com arquivos grandes.

Eu escrevi um utilitário JScript / batch híbrido chamado REPL.BAT que facilita o trabalho e deve ser muito rápido. O utilitário executa uma pesquisa em regex e substitui as linhas lidas de stdin e grava o resultado em stdout. Tem um bom número de opções, incluindo opções que simplificam essa tarefa. O utilitário é puro script que será executado em qualquer máquina moderna do Windows a partir do XP. A documentação completa está incorporada no script.

Veja como ele pode ser usado para resolver seu problema, supondo que a pesquisa seja diferencia maiúsculas de minúsculas .

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

Se você quiser que a pesquisa seja insensível a maiúsculas e minúsculas

<yourFile.txt repl (null) \n$1\n aix | find /i /c "null"
    
por 18.07.2014 / 22:56
0

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

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

A opção desejada é -c ou --count .

Conforme o comentário do @dbenham abaixo, a maneira de realmente contar não apenas linhas com 'null', mas também várias instâncias PER LINE é:

grep -o null file-to-read.txt | grep -c 
    
por 18.07.2014 / 17:52
-1

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

Se alguém pode fazer isso com um lote puro, melhor ainda em um sentido.

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

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

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

(o -o no grep -o é importante para que não retorne toda a linha. E isso é particularmente importante porque se o rrr ocorrer muitas vezes em uma linha, você não quer apenas que ele exiba rrr apenas uma vez 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>
    
por 18.07.2014 / 15:07