Поиск двойного слова внутри файла .txt с помощью пакетного файла

Я провел некоторое исследование в Google, чтобы найти ответ на свой вопрос, единственное, что я нашел, было похоже на мой вопрос на этом сайте: Поиск слова внутри .txt-файла с помощью пакетного файла

Я создал пакетный файл, который создает файл .txt с 8 строками, например:

Привет

Приятель

Как

Являются

Ты

Делает

до свидания

до свидания

Я хочу создать пакетный файл, который может обнаруживать двойные слова внутри текстового файла, в этом файле он должен обнаруживать Bye

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

Может ли findtr обнаружить, что слово Bye встречается дважды?

В моем файле я хочу получить такой отчет

эхо в текстовом файле, который вы сделали% нет или есть% двойное слово, поэтому я хочу, чтобы результат findstr в переменную% нет или есть%

Извините, если это плохой вопрос, но я новичок в stackoverflow и я голландец: / (много текста переведено с помощью Google Translate), и не могли бы вы объяснить, если это плохой вопрос, как я могу сделать его более понятным для вас


person hello    schedule 27.05.2016    source источник
comment
Должны ли двойные слова быть последовательными? Или вы все равно считаете его двойным, если между ними есть еще одно слово?   -  person dbenham    schedule 28.05.2016


Ответы (2)


Ответ Стефана работает, но он печатает каждое повторяющееся слово столько раз, сколько оно появляется. Это также довольно неэффективно, читая весь файл один раз для каждой строки в файле.

Вот довольно простое чисто пакетное решение, которое печатает каждое повторяющееся слово только один раз. Задача намного упрощается, если вы используете SORT для группировки всех реплик вместе. Однако команда Windows SORT игнорирует регистр, поэтому IF также должен игнорировать регистр. Это решение считывает файл только дважды, независимо от размера, один раз для SORT и один раз для FOR/F.

@echo off
setlocal enableDelayedExpansion

set "prev="
set "dup="
for /f "delims=" %%W in ('sort test.txt') do (
  if /i %%W==!prev! (
    if not defined dup echo(%%W
    set dup=1
  ) else set "dup="
  set "prev=%%W"
)

Если вы хотите, чтобы сравнение слов было чувствительным к регистру, то для приведенного выше алгоритма требуется процедура SORT с учетом регистра. Я написал JSORT.BAT именно для этого (среди другие вещи). Это чистый скрипт (гибрид JScript/пакетный), который изначально запускается в Windows.

Но если вы хотите использовать гибрид JScrpt/batch, решение станет очень простым, если вы добавите мой Утилита поиска/замены регулярных выражений JREPL.BAT. Параметр /M позволяет мне искать повторяющиеся слова в новых строках.

jsort test.txt | jrepl "^(.+)$(\r?\n\1$)+" $1 /jmatch /m

Для запуска механизма JScript требуется значительное время инициализации, поэтому это решение немного медленнее, чем чисто пакетное решение, если файл небольшой. Но если файл большой, то это намного быстрее, чем чисто пакетное решение.

person dbenham    schedule 29.05.2016
comment
Спасибо за этот пост :) - person hello; 29.05.2016

вот с чего начать:

@echo off
for /f %%i in (t.txt) do for /f %%a in ('type t.txt^|findstr /x "%%i"^|find /v /c "" ') do if %%a gtr 1 echo %%i

findstr не умеет считать, поэтому приходится использовать find /c в качестве помощника

см. find /?, findstr /? и for /? для получения дополнительной информации.

person Stephan    schedule 27.05.2016
comment
Спасибо за помощь! это мне очень помогает - person hello; 27.05.2016
comment
Могу ли я преобразовать/изменить этот %%i в обычную переменную, такую ​​как %i%? - person hello; 27.05.2016
comment
можно ли вывести результат команды for в (output.txt)? - person hello; 28.05.2016
comment
Теперь у меня есть этот код для /f %%i in (t.txt) do for /f %%a in ('type t.txt^|findstr /x %%i^|find /v /c ') do if %%a gtr 1 echo %%i ›› result.txt работает, но я хочу сделать это в файлах программы, а это не работает так: for /f %%i in (C:\Program Files\something.txt ) do for /f %%a in ('type something.txt^|findstr /x %%i^|find /v /c ') do if %%a gtr 1 echo %%ii провел небольшое исследование и нашел программу^ файлы и программы, но это не работает. возможно ли это в файлах программы? Вы можете объяснить? - person hello; 28.05.2016
comment
я наконец закончил это, и это работает! Спасибо за помощь - person hello; 28.05.2016