пакет для сканирования файла на наличие строки и получения строки выше во всех случаях, затем> output.txt - PullRequest
0 голосов
/ 05 июня 2018

У меня есть файл list.txt, подобный этому небольшому образцу:

banana.zip
xxx / yyy / zzz
orange.zip
kkklllmmm
lemon.zip
abc / def / ghi
apple.zip
xxx / yyy / zzz
pineaple.zip
kkklllmmm

Мне нужно отфильтровать строки .zip на основе строки ниже.Итак, если я выберу строку kkklllmmm, результат должен быть:

orange.zip
pineaple.zip

Я запустил пакетный скрипт, но он не завершен:

@echo off

set "input_list=list.txt"
set "string=kkklllmmm"
set "output_list=output.txt"

for /f "delims=:" %%# in ('findstr /n  /c:"%string%" "%input_list%"') do (
    set "line=%%#"
    set /a "lineBefore=line-1"
    for /f "delims=:" %%a in ("[CONTENT OF %lineBefore%]") do echo %%a>%output_list%)

Буду признателен за помощьисправить этот код и заставить его работать.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Вы используете команду PowerShell:

powershell -nop -c "sls List.txt -Patt 'kkklllmmm' -Co 1,0|%{$_.Context.PreContext}">output.txt

Или заключите ее в пакет:

@echo off
setlocal enabledelayedexpansion
set "input_list=list.txt"
set "string=kkklllmmm"
set "output_list=output.txt"
(powershell -nop -c "sls '%input_List%' -Patt '%string%' -Co 1,0|%%{$_.Context.PreContext}"
)>"%output_list%"

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

orange.zip
pineaple.zip
0 голосов
/ 05 июня 2018

, чтобы объяснить предложение Сквошмана:

@echo off
setlocal enabledelayedexpansion
set "input_list=list.txt"
set "string=kkklllmmm"
set "output_list=output.txt"

(for /f "delims=" %%# in (%input_list%) do (
    REM if current line is your searchstring, then echo the previous line:
    if "%%#"=="%string%" echo !line!
    REM set the variable to the current line:
    set "line=%%#"
)) > "%output_list%"

Примечание: я использовал пустой разделитель, чтобы прочитать всю строку.Если вы намеренно использовали : по какой-то причине (кроме «некоторого символа, которого нет в файле для чтения всей строки»), просто переопределите его.

Редактировать:

How did you get the previous line? путем установки переменной line после сравнения %%# (текущая строка), поэтому при каждом повороте цикла в конце line - текущая строка, нона следующем ходу в начале это будет «предыдущая линия» (и станет «текущей линией» только в конце хода)

I need to find more than one string: немного сложнее: добавить секундуfor для обработки каждой строки поиска.Обратите внимание на синтаксис строки set "string=...".Также для обработки строк с пробелами этот синтаксис является обязательным.(если бы не было пробелов, это упростило бы до set "string=string1 string2 string3"), но для обработки пробелов каждая подстрока тоже должна быть заключена в кавычки:
set "string="string 1" "string 2" "string 3"")

@echo off
setlocal enabledelayedexpansion
set "input_list=list.txt"
set "string="kkklllmmm" "xxx / yyy / zzz""
set "output_list=output.txt"
(for /f "delims=:" %%# in (%input_list%) do (
    for %%a in (%string%) do (
        echo %%#|findstr /xc:%%a >nul && echo !line!
    )
    set "line=%%#"
)) > "%output_list%"

Внешний for(%%#) получает по одной строке за раз.
Внутренний for обрабатывает каждую подстроку в списке за раз.
Следующая строка echo проверяет строку и пытается найти подстроку (переключатели
x = сравнить всю строку,
c = найти буквенную строку (включая пробелы, иначе он попытается найти каждое слово в строке, например, xxx, /,yyy и т. Д.)
&& выполняет команду echo !line! только в случае успешного выполнения предыдущей команды (findstr найдено совпадение)

...