сравнить два файла на основе частично одинаковой строки и вывести одинаковое содержимое - PullRequest
0 голосов
/ 23 января 2019

У меня есть два файла

Первый файл выглядит так:

500006011000.S3S.mockup
500007011000.S3S.mockup
500008011000.S3S.mockup
500009011000.S3S.mockup
500010011000.S3S.mockup
500012011000.S3S.mockup
500014011000.S3S.mockup
500016011000.S3S.mockup
500134010100.S3S.mockup
500028011201.S3S.mockup
500129010200.S3S.mockup
500142010100.S3S.mockup
500144010100.S3S.mockup
500015011800.S3S.mockup

Второй файл выглядит

500006011000.S3S
500006011000.S3S
500007011000.S3S
500008011000.S3S
500009011000.S3S
500010011000.S3S
500011011000.S3S
500012011000.S3S
500014011000.S3S
500015011800.S3S
500016011000.S3S
500018011000.S3S
500022010400.S3S
500028011201.S3S
500031010200.S3S
500032030200.S3S
500040020500.S3S
500063011000.S3S
500067010001.S3S
500072010400.S3S
500099010300.S3S
500129010200.S3S
500134010100.S3S
500142010100.S3S
500144010100.S3S
500146010100.S3S
500147010100.S3S
Contents.lst
gen_sch_list.txt

Я могу использовать этот код для сравнения и вывода того же контента

findstr /ixg:C:\CA_MOCKUP\first.txt C:\CA_MOCKUP\second.txt > C:\CA_MOCKUP\result.txt

Обычно это работает, только если первый текстовый файл удаляет .mockup для каждой строки.

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

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Боюсь, ваш вопрос довольно запутанный.findstr команда не сравнивает файлы ;это найти строки .(Кстати см. fc команда).Кроме того, вы не указали, из какого файла вы хотите "того же контента" ...

Код ниже извлекает строки из файла first.txt, первые шесть символов которого также отображаются впервые шесть символов в любой строке из second.txt файла:

@echo off
setlocal EnableDelayedExpansion

rem Create the "key" array with the first six chars from second.txt file
for /F "delims=" %%a in (second.txt) do (
   set "line=%%a"
   set "key[!line:~0,6!]=1"
)

rem Extract the lines in first.txt file with the same key
(for /F "delims=" %%a in (first.txt) do (
   set "line=%%a"
   set "s6=!line:~0,6!"
   if defined key[!s6!] echo !line!
)) > result.txt
0 голосов
/ 23 января 2019

Для сбора только первых 6 символов каждой строки мы можем использовать несколько циклов for вместе с syntax-substring . Мы можем просто сохранить эти измененные данные в новых временных файлах для последующего сравнения с findstr.

CompareFirst6Chars.bat:

@echo off
@setlocal enabledelayedexpansion

Rem | Configuration
Set "CompaireFile1=1.txt"
Set "CompaireFile2=2.txt"
Set "ResultFile=result.txt

Rem | Loop For Each Item
for %%A in (!CompaireFile1! !CompaireFile2!) do (

    Rem | Grab Only First 6 Characters From Files, Format In Modified
    for /f "Tokens=*" %%B in (%%A) do (

        Rem | Save & Modify Strings
        Set "Modified=%%B"
        Set "Modified=!Modified:~0,6!"

        Rem | Save To File
        Echo !Modified!>> %%A.temp

    )
)

Rem | Compare & Extract Results
findstr /ixg:!CompaireFile1!.temp !CompaireFile2!.temp > !ResultFile!

Rem | Remove Temp Files
Del "!CompaireFile1!.temp" "!CompaireFile2!.temp"
goto :EOF

Это даст нам следующий результат:

500006
500006
500007
500008
500009
500010
500012
500014
500015
500016
500028
500129
500134
500142
500144

Альтернативное решение - полностью удалить .mockup из строки. Для этого процесс очень симуляционный, но вместо синтаксис-подстрока мы используем синтаксис-замена . Это позволит нам заменить все .mockup на ничто.

RemoveMockupCompareFiles.bat:

@echo off
@setlocal enabledelayedexpansion

Rem | Configuration
Set "CompaireFile1=1.txt"
Set "CompaireFile2=2.txt"
Set "ResultFile=result.txt

Rem | Loop For Each Item
for %%A in (!CompaireFile1! !CompaireFile2!) do (

    Rem | Grab Only First 6 Characters From Files, Format In Modified
    for /f "Tokens=*" %%B in (%%A) do (

        Rem | Save & Modify Strings
        Set "Modified=%%B"
        Set "Modified=!Modified:.mockup=!"

        Rem | Save To File
        Echo !Modified!>> %%A.temp

    )
)

Rem | Compare & Extract Results
findstr /ixg:!CompaireFile1!.temp !CompaireFile2!.temp > !ResultFile!

Rem | Remove Temp Files
Del "!CompaireFile1!.temp" "!CompaireFile2!.temp"
goto :EOF

Это даст нам вывод следующего:

500006011000.S3S
500006011000.S3S
500007011000.S3S
500008011000.S3S
500009011000.S3S
500010011000.S3S
500012011000.S3S
500014011000.S3S
500015011800.S3S
500016011000.S3S
500028011201.S3S
500129010200.S3S
500134010100.S3S
500142010100.S3S
500144010100.S3S

Для получения справки по любой из команд выполните следующее:

  • call /?
  • set /?
  • for /?
  • if /?
  • find /?
  • И так далее.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...