PDA

Показать полную графическую версию : [решено] Подсчет совпадающих строк в разных файлах


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

Georgio
29-08-2014, 15:22
@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
извиняюсь за непонятки - 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
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
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
Georgio, спасибо. Сокращенный вариант тоже создает просто пустой файл, а вот исправленный который #4 (http://forum.oszone.net/post-2395906-4.html) работает.




© OSzone.net 2001-2012