Есть ли в Windows способ подсчитать количество появлений строки в файле?

Есть ли в Windows способ подсчитать количество появлений строки в файле?

В настоящее время я пытаюсь написать пакетный скрипт, и на этом этапе мне нужно найти строку «null» и определить, сколько раз она отображается в файле.

Я загружаю API с веб-сайта каждый раз, когда запускается скрипт, и в их API время от времени появляется "null". Когда их API загружается, он загружается в одну строку, и я пробовал это:

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

Но здесь отображается только «1», поскольку файл состоит всего из 1 строки.

Есть ли другой способ вывести количество раз, когда в файле встречается «null»?

добавлено пользователем barlop
Автор статьи только что упомянул, что не может устанавливать стороннее программное обеспечение.

решение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

При работе с большими файлами это может быть довольно медленно.


Я написалгибридная JScript/пакетная утилита под названием REPL.BATэто может облегчить работу и должно быть довольно быстрым. Утилита выполняет поиск и замену регулярных выражений в строках, считываемых из stdin, и записывает результат в stdout. У нее есть довольно много опций, включая опции, упрощающие эту задачу. Утилита представляет собой чистый скрипт, который будет работать на любой современной машине Windows, начиная с XP. Полная документация встроена в скрипт.

Вот как это можно использовать для решения вашей проблемы, предполагая, что поискс учетом регистра.

<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», но и нескольких экземпляров В КАЖДОЙ СТРОКЕ следующий:

grep -o null файл-для-чтения.txt | grep -c 

решение3

Это не очень пуристский подход. Он требует, чтобы вы получили gnuwin32 с пакетами coreutils и grep.

Если кто-то сможет сделать это с чистой партией, то в каком-то смысле будет лучше.

Но grep и wc — это способ GNU/Linux, который можно использовать в Windows.

copy con aa <-- создает файл aa. Обратите внимание, что в нем есть строка rrr 3 раза.

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

(-o в grep -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>

Связанный контент