Войти

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


Страниц : [1] 2

Seryoga204
24-08-2010, 23:20
Ув. форумчане подскажите пожалуйста, как можно скопировать из файла (С:\1.txt)- все строки которые начинаются на:
/1000
/2000
/3000
/4000
/5000
/6000
, в файл 2.txt ?

deepred
25-08-2010, 00:21
Seryoga204,

Echo on & Chcp 1251
Set "$SRS=F:\probe\переименование\1.txt"
Set "$DST=F:\probe\переименование\2.txt"

:loop
Set /a $num+=1
If /i %$num% GTR 6 goto :Eof
Set $Crt=^/%$num%000

For /f "tokens=*" %%a in ('^<%$SRS% Find /i "%$Crt%"') Do Echo %%a >> %$DST%
goto loop

Seryoga204
25-08-2010, 00:51
Спасибо большое все отлично работает, только батник :teeth: не завершает работу, а по кругу отбирает записи?

deepred
25-08-2010, 01:08
Seryoga204,

почему не завершает? Сколько там у Вас записей с подобным критерием отбора?
goto :Eof » - там не просто так...

Seryoga204
25-08-2010, 01:28
Все получилось! Спасибо!

amel27
25-08-2010, 02:59
FindStr /BRC:"/[1-6]000" 1.txt >2.txt

Seryoga204
25-08-2010, 03:31
amel27,Спасибо! а если еще надо строки которые начинаются со слова "Отдел", так чтобы в файле 2.txt сохранилась последовательность?

amel27
25-08-2010, 08:24
еще надо строки которые начинаются со слова "Отдел" »
зависит от исходной кодировки текстового файла, для DOS (OEM/866) всё просто:
FindStr /BRC:"/[1-6]000" /C:"Отдел" 1.txt >2.txt

для WIN (ANSI/1251) требуется промежуточная перекодировка во временный файл, типа:
(см. аттач, спецсимволы не дали корректно запостить код)

...либо вместо штатной FINDSTR использовать альтернативы типа GREP

Seryoga204
26-09-2010, 10:11
FindStr /BRC:"/[1-6]000" /C:"Отдел" 1.txt >2.txt
А можно сделать так:
чтобы также копировалась следующая строка идущая после строки удовлетворяющей условию?
и в файле 2.txt в начале скопированных строк прописывалось значение "999 "?

amel27
26-09-2010, 16:45
чтобы также копировалась следующая строка идущая после строки удовлетворяющей условию »штатными средствами непросто, как вариант (текстовый файл в DOS-кодировке):@echo off
SetLocal EnableDelayedExpansion

set fi=1.txt
set fo=1.out

(for /f "tokens=1 delims=:" %%i in ('findstr /brnc:"/[1-6]000" /c:"Отдел" "%fi%"') do (
set /a $j=%%i+1& for /f "tokens=1* delims=[]" %%a in (
'find /v /n ""^<"%fi%"^|findstr /bc:"[%%i]" /c:"[!$j!]"') do echo.%%b
)) >"%fo%"

вариант на SED (текстовый файл в WIN-кодировке):set fi=2.txt
set fo=2.out

sed -n "/^\/[1-6]\|^Отдел/{p;n;p;}" "%fi%" >"%fo%"

вариант на AWK (текстовый файл в WIN-кодировке):set fi=3.txt
set fo=3.out

awk "{p-=1};/^\/[1-6]|^Отдел/{p=2};p>0" %fi% >%fo%

amel27
26-09-2010, 17:03
в начале скопированных строк прописывалось значение "999 " »
@echo off
SetLocal EnableDelayedExpansion

set fi=1.txt
set fo=1.out

(for /f "tokens=1 delims=:" %%i in ('findstr /brnc:"/[1-6]000" /c:"Отдел" "%fi%"') do (
set /a $j=%%i+1& for /f "tokens=1* delims=[]" %%a in (
'find /v /n ""^<"%fi%"^|findstr /bc:"[%%i]" /c:"[!$j!]"') do echo.999%%b
)) >"%fo%"


@echo off

set fi=2.txt
set fo=2.out

sed -n "/^\/[1-6]\|^Отдел/{s/^/999/p;n;s/^/999/p;}" "%fi%" >"%fo%"


@echo off

set fi=3.txt
set fo=3.out

awk "{p-=1};/^\/[1-6]|^Отдел/{p=2};p>0{print 999$0}" %fi% >%fo%

Seryoga204
26-09-2010, 20:42
amel27,
Спасибо большое все работает отлично!
Еще появилась необходимость отбирать допустим строки которые начинаются не на слово "Отдел", а на "Отдел*", как экранировать символ "*", пробывал "Отдел^*" не проходит?

Darkherald
10-01-2011, 09:19
Помогите пожалуйста нужен скрипт "Копирование строк в отдельный файл по условию"

Который должен в файле 1.txt находить слова из файла 2.txt и копировать всю строку в которой было найдено одно из слова из файла 2.txt и копировать подряд в файла 3.txt именно полными строками.
Пример: Имеется лог фаил в нем много хлама.

рараррра тиитилоп обращение тпопотаоптоа
обращение паолпоалпоатоавтм топтлвоатлмо

Скрипт должен посмотреть заданное слово из файла 2.txt например "обращение" и найти его в файле 1.txt и скопировать в файл 3.txt полностью строку

рараррра тиитилоп обращение тпопотаоптоа
обращение паолпоалпоатоавтм топтлвоатлмо

а не просто найденное слово "обращение"

Заранее спасибо, извините если не явно выразил суть проблемы.

amel27
11-01-2011, 04:56
в файле 1.txt находить слова из файла 2.txt и копировать всю строку в которой было найдено одно из слов »findstr /ig:2.txt 1.txt >3.txt

Darkherald
11-01-2011, 10:10
amel27 спасибо огромное то что нужно

AlexVong
12-04-2011, 21:22
Подскажите как подправить код
@echo off SetLocal EnableDelayedExpansion
set fi=1.txt
set fo=1.out
(for /f "tokens=1 delims=:" %%i in ('findstr /brnc:"000000" /c:"Отдел" "%fi%"') do
( set /a $j=%%i+1& for /f "tokens=1* delims=[]" %%a
in ( 'find /v /n ""^<"%fi%"^|findstr /bc:"[%%i]" /c:"[!$j!]"')
do echo.999%%b )) >"%fo%"
Чтобы по условию "000000" копировались строки которые начинаются на 000000, а по условию "Отдел" строка + 4 последующие за ней.

AlexVong
13-04-2011, 20:32
Подскажите пожалуйста.Или по первому и второму условию копировались помимо строки удовлетворяющей поиску 4 последующие строки. Заранее спасибо.

amel27
14-04-2011, 06:53
по условию "000000" копировались строки которые начинаются на 000000, а по условию "Отдел" строка + 4 последующие за ней »
set fi=1.txt
set fo=1.out

(for /f "delims=" %%a in ('type "%fi%"') do @(set "$a=%%a"
SETLOCAL EnableDelayedExpansion
if /i "!$a:~,6!"=="000000" set $p=1
if /i "!$a:~,5!"=="Отдел" set $p=5
if !$p! gtr 0 set /a "$p-=1"& echo/!$a!
for %%b in ("!$p!") do @ENDLOCAL& set $p=%%~b
))>"%fo%"

AlexVong
03-05-2011, 18:39
FindStr /BRC:"Текст" /C:"Текст2" *.* >2.txt
Подскажите как заставить FindStr работать с файлами в кодировке 1251?

Foreigner
03-05-2011, 19:55
Подскажите как заставить FindStr работать с файлами в кодировке 1251? »
Выставить нужную кодировку:

chcp 1251
FindStr /BRC:"Текст" /C:"Текст2" *.* >2.txt




© OSzone.net 2001-2012