En Windows, ¿hay alguna manera de contar la cantidad de veces que aparece una cadena en un archivo?

En Windows, ¿hay alguna manera de contar la cantidad de veces que aparece una cadena en un archivo?

Actualmente estoy intentando escribir un script por lotes y, en este punto, necesito encontrar una cadena, "nula", y determinar cuántas veces se muestra en el archivo.

Estoy descargando una API de un sitio web cada vez que se inicia el script y dentro de su API tienen "nulo" de vez en cuando. Cuando se descarga su API, se descarga en una sola línea y he estado intentando esto:

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

Pero esto solo muestra un "1" debido a que el archivo solo tiene 1 línea de largo.

¿Existe alguna otra forma de generar la cantidad de veces que "nulo" está en el archivo?

añadido por barlop
OP también acaba de mencionar que no puede instalar software de terceros.

Respuesta1

Tengo que creer que esto ya se ha preguntado y respondido antes. Pero aquí hay un script por lotes simple que puede hacer el trabajo.

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

El uso de la línea de comando sería

StringCount null yourFile.txt

Esto podría volverse bastante lento con archivos grandes.


he escrito unutilidad híbrida JScript/por lotes llamada REPL.BATeso puede facilitar el trabajo y debería ser bastante rápido. La utilidad realiza una búsqueda de expresiones regulares y reemplaza líneas leídas desde stdin y escribe el resultado en stdout. Tiene una buena cantidad de opciones, incluidas opciones que simplifican esta tarea. La utilidad es un script puro que se ejecutará en cualquier máquina moderna con Windows desde XP en adelante. La documentación completa está integrada en el script.

Así es como podría usarse para resolver su problema, suponiendo que la búsqueda seadistingue mayúsculas y minúsculas.

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

Si quieres que la búsqueda seano distingue entre mayúsculas y minúsculas

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

Respuesta2

¿Tiene la opción de descargar un solo ejecutable?

Lo que necesitas es una greputilidad bien adaptada.
por ejemplo, grep (GNU grep) 2.16

La opción que quieres es -co --count.

Según el comentario de @dbenham a continuación, la forma de contar no solo las líneas con 'nulo', sino también varias instancias POR LÍNEA es:

grep -o archivo nulo para leer.txt | grep-c 

Respuesta3

Este no es un enfoque muy purista. Requiere que obtenga gnuwin32 con los paquetes coreutils y grep.

Si alguien puede hacerlo con un lote puro, mucho mejor en cierto sentido.

Pero grep y wc es la forma GNU/linux que puedes hacer en Windows.

copiar con aa <-- crea el archivo aa. Observe que tiene la cadena rrr 3 veces.

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

(el -o en grep -o es importante para que no devuelva la línea completa. Y eso es particularmente importante porque si rrr ocurre muchas veces en una línea, no querrás que muestre rrr solo una vez para esa línea. grep -o obtiene cada aparición de rrr en una nueva línea. El número total de líneas es entonces el número total de apariciones).

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

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

C:\blah>

información relacionada