Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Подсчет совпадающих строк в разных файлах (http://forum.oszone.net/showthread.php?t=287197)

Elven 29-08-2014 14:23 2395775

Подсчет совпадающих строк в разных файлах
 
Не уверен что объяснил правильно, но суть приблизительно такова: имеем несколько логов в папке logs\old\ (old1.log, old2.log old3.log и т.д.) еще один лог формируется в текущий момент и ложится в logs\new.log. Теперь собственно задача: нужно взять построчно new.log и проверить не было ли таких же строк в старых логах, в случае пяти и более совпадений записать эту строку в отдельный файл (например result.log).

Georgio 29-08-2014 15:22 2395808

Код:

@echo off

pushd "logs\old"
(
for /f "usebackq delims=" %%i in ("..\new.log") do (
 for %%j in (
  "old1.log"
  "old2.log"
  "old3.log"
  ) do (
  for /f "usebackq delims=" %%k in (%%j) do (
  set /p=%%k<nul| findstr /lc:"%%i">nul&& (
  set /a count+=1
  for /f %%l in ('
    set /a count
  ') do (
    if %%l==5 (
    echo.%%i
    )
    )
    )
  )
  )
 set count=
 )
)>"%~dp0result.log"
popd

exit /b


Elven 29-08-2014 16:14 2395838

извиняюсь за непонятки - old1.log, old2.log, old3.log я дал чисто для примера
подредактировал чтобы целпяло все нужные файлы - не фурычит. создается пустой файл, хотя строки находит и их заведомо больше чем 5. где я накосячил?
Код:

@echo off
pushd "logs\old"
(
for /f "usebackq delims=" %%i in ("..\new.log") do (
 for /f %%j in ('dir /B /O-D *.log') do (
  for /f "usebackq delims=" %%k in (%%j) do (
  set /p=%%k<nul| findstr /lc:"%%i" "..\new.log">nul&& set /a count+=1
  for /f %%l in ('
    set /a count
  ') do (
    if %%l GEQ 5 (
    echo.%%k
    set count=
    )
    )
  )
  )
 )
)>"%~dp0result.log"
popd


Georgio 29-08-2014 18:49 2395906

Elven, отредактировал и свой код (см. выше), и Ваш код (см. ниже). Оба работают.


Код:

@echo off
pushd "logs\old"
(
for /f "usebackq delims=" %%i in ("..\new.log") do (
 for /f "delims=" %%j in ('dir /a-d/b/o-d *.log') do (
  for /f "usebackq delims=" %%k in ("%%j") do (
  set /p=%%k<nul| findstr /lc:"%%i">nul&& (
  set /a count+=1
  for /f %%l in ('
    set /a count
  ') do (
    if %%l equ 5 (
    echo.%%k
    )
    )
    )
  )
  )
 set count=
 )
)>"%~dp0result.log"
popd


Georgio 31-08-2014 17:09 2396635

Elven, существенно упростил решение:


Код:

@echo off

pushd "logs\old"
(
for /f "usebackq delims=" %%i in ("..\new.log") do (
 for /f %%j in ('
  findstr /lxc:"%%i" *.log^| find /c /v ""
 ') do (
  if %%j geq 5 (
  echo.%%i
  )
  )
 )
)>"%~dp0result.log"
popd

exit /b


.

Elven 01-09-2014 10:08 2396876

Georgio, спасибо. Сокращенный вариант тоже создает просто пустой файл, а вот исправленный который #4 работает.


Время: 14:09.

Время: 14:09.
© OSzone.net 2001-