В Windows есть способ подсчитать, сколько раз строка появляется в файле
В настоящее время я пытаюсь написать пакетный скрипт, и на данный момент мне нужно найти строку "null" и определить, сколько раз она отображается в файле.
Я загружаю API с веб-сайта каждый раз, когда запускается скрипт, и в их API время от времени они имеют значение "ноль". Когда их API загружен, он загружается в одну строку, и я пытался это:
findstr /C:"null" %TEMP%\$SELECT%.txt | find /C "null" > $TEMP$\$SELECT$-status.txt
Но это только отображает "1", потому что файл только 1 строка.
Есть ли какой-то другой способ вывести количество раз, когда "null" находится в файле?
добавлено барлопом
ОП также упомянул, что не может установить стороннее программное обеспечение.
3 ответа
Я должен верить, что об этом уже спрашивали и отвечали. Но вот простой пакетный скрипт, который может сделать эту работу.
::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/batch REPL.BAT, которая может упростить работу и должна быть достаточно быстрой. Утилита выполняет поиск и замену регулярных выражений в строках, считанных из стандартного ввода, и записывает результат в стандартный вывод. У него есть достаточное количество опций, включая опции, которые упрощают эту задачу. Утилита представляет собой чистый скрипт, который будет работать на любой современной машине с 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"
У вас есть возможность скачать один исполняемый файл?
Что вам нужно, так это хорошо перенесенный grep
полезность.
например, grep (GNU grep) 2.16
Опция, которую вы хотите -c
или же --count
,
Согласно приведенному ниже комментарию @dbenham, способ на самом деле считать не только строки с "нулем", но и несколько экземпляров PER LINE:
grep -o нулевой файл для чтения.txt | grep -c
Это не очень пуристический подход. Это требует, чтобы вы получили 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>