PDA

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


Bruce Wayne
07-08-2013, 12:56
Добрый день!

В теме http://forum.oszone.net/post-2190909.html есть такой же вопрос, но ответ дан для строк, не содержащих пробелы. В моём случае присутствуют пробелы, кавычки и квадратные скобки. Подскажите, пожалуйста, как можно реализовать вывод из исходного файла строк, исключая дубликаты? Я пробовал так:

for /f "delims=" %%a in (123.txt) do (
findstr /i /x /c:"%%a" 456.txt || echo %%a >> 456.txt)

Но кавычки мешают :(

amel27
07-08-2013, 13:19
если порядок не важен:@echo off
(
for /f "tokens=1* delims=[] " %%a in ('^<123.txt find /n /v ""') do set "$.%%b=."
for /f "tokens=*" %%a in ('set $.') do (set "$a=%%a"
setlocal EnableDelayedExpansion
set "$a=!$a:~2,-2!"
echo/!$a!
endlocal
))>456.txt

Bruce Wayne
07-08-2013, 13:52
amel27, Спасибо большое! А можно пример с сохранением порядка, пожалуйста, если не затруднит?

Bruce Wayne
07-08-2013, 14:39
Всё, проблема решена! :D Извините за беспокойство. Вот что получилось:

@echo off
setlocal disableDelayedExpansion
set "file=123.txt"
set "line=%file%.line"
set "deduped=%file%.deduped"
set LF=^

>"%deduped%" (
for /f usebackq^ eol^=^%LF%%LF%^ delims^= %%A in ("%file%") do (
set "ln=%%A"
setlocal enableDelayedExpansion
>"%line%" (echo !ln:\=\\!)
>nul findstr /xlg:"%line%" "%deduped%" || (echo !ln!)
endlocal
)
)
>nul move /y "%deduped%" "%file%"
2>nul del "%line%"

Правда, результат перезаписывает исходный файл, но так даже удобнее)

amel27
07-08-2013, 14:47
пример с сохранением порядка »
@echo off
(
for /f "tokens=1* delims=[] " %%a in ('^<123.txt find /n /v ""') do (
set "$b=$.%%b"
setlocal EnableDelayedExpansion
if not defined !$b! echo/!$b:~2!
endlocal
set "$.%%b=."
))>456.txt

Bruce Wayne
07-08-2013, 14:50
amel27, спасибо огромное!




© OSzone.net 2001-2012