Как найти количество вхождений строки в файл с помощью командной строки Windows? - PullRequest
10 голосов
/ 16 февраля 2012

У меня есть огромные файлы с адресами электронной почты, и я хотел бы посчитать, сколько их в этом файле. Как я могу сделать это с помощью командной строки Windows?

Я пробовал это, но он просто печатает соответствующие строки. (кстати: все электронные письма содержатся в одной строке)

findstr /c:"@" mail.txt

Ответы [ 9 ]

14 голосов
/ 16 февраля 2012

Используя то, что у вас есть, вы можете передать результаты через find.Время от времени я видел что-то подобное.

findstr /c:"@" mail.txt | find /c /v "GarbageStringDefNotInYourResults"

Итак, вы подсчитываете строки, полученные из вашей команды findstr, в которой нет строки мусора.Вроде хак, но это может сработать для вас.В качестве альтернативы, просто используйте find /c в строке, которая вам нужна.Наконец, вы упомянули один адрес на строку, так что в этом случае работает выше, но несколько адресов на строку, и это ломается.

4 голосов
/ 16 ноября 2016

Почему бы просто не использовать это (это определяет количество строк, содержащих (как минимум) @ символ.):

find /C "@" "mail.txt"

Пример вывода:

---------- MAIL.TXT: 96

Чтобы избежать имени файла в выводе, измените его следующим образом:

find /C "@" < "mail.txt"

Пример вывода:

96

Чтобы получить результирующее число и сохранить его в переменной, используйте это (измените %N на %%N в пакетном файле):

set "NUM=0"
for /F %N in ('find /C "@" ^< "mail.txt"') do set "NUM=%N"
echo %NUM%
3 голосов
/ 12 августа 2014

Может быть, уже немного поздно, но у меня сработал следующий скрипт (исходный файл содержал символы кавычек, поэтому я использовал параметр 'usebackq'). Знак каретки (^) действует как escape-символ в языке сценариев пакетной обработки Windows.

@setlocal enableextensions enabledelayedexpansion    
SET TOTAL=0
FOR /F "usebackq tokens=*" %%I IN (file.txt) do (
    SET LN=%%I
    FOR %%J IN ("!LN!") do (
        FOR /F %%K IN ('ECHO %%J ^| FIND /I /C "searchPhrase"') DO (
            @SET /A TOTAL=!TOTAL!+%%K
        )
    )
)
ECHO Number of occurences is !TOTAL!
2 голосов
/ 01 октября 2015

Очень простое решение:

grep -o "@" mail.txt | grep -c .

Запомните точку в конце строки!

Вот немного более понятный способ:

grep -o "@" mail.txt | grep -c "@"

Первый выбор grepтолько строки "@" и ставьте каждую в новую строку.

Второй grep считает строки (или строки с @).

Утилита grep может быть установлена ​​из Проект GnuWin или WinGrep сайтов.Это очень маленький и безопасный текстовый фильтр.Grep - одна из самых полезных команд Unix / Linux, и я ежедневно использую ее как в Linux, так и в Windows.Windows findstr хороша, но не имеет таких функций, как grep.

Установка grep в Windows будет одним из лучших решений, если вам нравится CLIили пакетные сценарии.

1 голос
/ 19 января 2018

ОК - поздно к таблице, но ... кажется, многие респонденты пропустили оригинальную спецификацию, что все адреса электронной почты встречаются в 1 строке . Это означает, что если вы не вводите CRLF с каждым появлением символа @, ваши предложения по использованию вариантов FINDSTR / c не помогут.

Среди инструментов Unix для DOS - очень мощный SED.exe. Погугли это. Это качает RegEx. Вот предложение:

find "@" datafile.txt | find "@" | sed "s/@/@\n/g" | find /n "@" | SED "s/\[\(.*\)\].*/Set \/a NumFound=\1/">CountChars.bat

Объяснение: (при условии, что файл с данными называется «Datafile.txt») 1) Первый FIND включает в себя 3 строки информации заголовка, которая отбрасывает подход подсчета строк, поэтому передайте результаты во 2-ую (идентичную) находку, чтобы убрать ненужную информацию заголовка.

2) Направьте вышеприведенные результаты в SED, который будет искать каждый символ "@" и заменять его на себя + "\ n" (который является "новой строкой" или CRLF), который получает каждый "@" на своем собственная строка в выходном потоке ...

3) Когда вы передадите вышеприведенный вывод из SED в команду FIND / n, вы добавите номера строк в начало каждой строки. Теперь все, что вам нужно сделать, это выделить числовую часть каждой строки и предварять ее с помощью «SET / a», чтобы преобразовать каждую строку в пакетный оператор, который (все чаще с каждой строкой) устанавливает переменную, равную номеру этой строки. *

4) изолировать числовую часть каждой строки и предварять изолированное число в соответствии с приведенным выше:
| SED "s/\[\(.*\)\].*/Set \/a NumFound=\1/"

В приведенном выше фрагменте вы передаете выходные данные предыдущих команд в SED, который использует этот синтаксис "s / WhatToLookFor / WhatToReplaceItWith /", чтобы выполнить следующие действия:

a) ищите «[» (который должен быть «экранирован», если перед ним стоит «\»)

b) начать сохранение (или «токенизацию») в дальнейшем, вплоть до закрытия «]»

    --> in other words it ignores the brackets but stores the number
    --> the ".*" that follows the bracket wildcards whatever follows the "]"

c) материал между \( и \) является "токенизированным", что означает, что к нему можно будет обратиться позже, в разделе "WhatToReplaceItWith". Первый материал, который является токенизированным, называется через «\ 1», затем второй как «\ 2» и т. Д.

Итак ... мы игнорируем [и] и сохраняем число, заключенное в квадратные скобки, и игнорируем все оставшиеся в каждой строке символы с подстановочными знаками ... таким образом, мы заменяем строку на буквальная строка: Set /a NumFound= + сохраненный или «токенизированный» номер, т.е. ... первая строка будет читать: Set /a NumFound=1 ... а следующая строка гласит: Set /a NumFound=2 и т. д. и т. д.

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

Последний исполненный = тот, который имеет значение.

Если вы используете символ «>» для перенаправления всего вышеприведенного вывода в пакетный файл, то есть: > CountChars.bat

... затем просто вызовите этот пакетный файл, и у вас будет переменная среды DOS с именем "NumFound" с вашим ответом.

1 голос
/ 16 февраля 2012

Я бы установил инструменты Unix в вашей системе (удобно в любом случае :-), тогда это действительно просто - посмотрите, например, здесь:

Подсчитайте количество вхождений строки, используя sed?

(Использование awk:

awk '$1 ~ /title/ {++c} END {print c}' FS=: myFile.txt

).

Здесь вы можете получить инструменты для Unix Windows:

http://unxutils.sourceforge.net/

1 голос
/ 16 февраля 2012

Я нашел это в сети. Посмотрите, работает ли оно:

findstr /R /N "^.*certainString.*$" file.txt | find /c "@"
0 голосов
/ 28 марта 2017

Используйте это:

type file.txt | find /i "@" /c
0 голосов
/ 07 июня 2013

Вот как я это делаю, используя условие AND с FINDSTR (для подсчета количества ошибок в файле журнала):

SET COUNT=0
FOR /F "tokens=4*" %%a IN ('TYPE "soapui.log" ^| FINDSTR.exe /I /R^
 /C:"Assertion" ^| FINDSTR.exe /I /R /C:"has status VALID"') DO (
  :: counts number of lines containing both "Assertion" and "has status VALID"
  SET /A COUNT+=1
)
SET /A PASSNUM=%COUNT%

ПРИМЕЧАНИЕ.чем «количество всех вхождений в файле».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...