Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/132: Рейтинг темы: голосов - 132, средняя оценка - 4.67
Nadia94
0 / 0 / 0
Регистрация: 02.10.2010
Сообщений: 34
1

Выделить из текстового файла n-ную строку (использовать FIND /N и FOR)

29.03.2011, 19:54. Просмотров 27134. Ответов 16
Метки нет (Все метки)

в универе дали задание создать файл бат "Выделить из текстового файла n-ую строку (использовать find /n и for)". вывод строки, насколько я поняла -

Windows Batch file
1
for /F "tokens=*" %i in (text.txt) do @echo %i > old.txt
кол-во строк -

Windows Batch file
1
2
3
for /F "tokens=*" %%i IN (%1) DO (
set /a n=n+1
)
но вместе они почему-то не работают, помогите, пожалуйста
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2011, 19:54
Ответы с готовыми решениями:

Выделить из текстового файла n-ую строку (использовать find /n и for)
Выделить из текстового файла n-ую строку (использовать find /n и for)

Выделить из текстового файла n-ую строку (использовать find /n и for)
Создать скрипт: Выделить из текстового файла n-ую строку (использовать find /n...

Получить N-ную строку текстового файла
Добрый день. Я батники никогда не писал, но по работе пришлось написать. Здесь...

Из TXT-файла скопировать n-ную строку и вставить ее вместо m-ной строки в DOC-файл
Нужно из одного txt файла скопировать n строку и вставить ее вместо m строки в...

Выделить из текстового файла все строки, начиная с заданной
Выделить из текстового файла все строки, начиная с заданной

16
erlik
134 / 106 / 8
Регистрация: 09.03.2010
Сообщений: 150
30.03.2011, 17:54 2
Лучший ответ Сообщение было отмечено как решение

Решение

В качестве примера: запишет найденную по номеру строку в файл и выведет в консоль общее число строк.
find не использовал так как не понял как с ним это провернуть.
Вот такая конструкция for /f "usebackq delims=" %%i in (`find /n "10" text.txt`) do приводит к бесконечному вызову cmd. В данном варианте пытался указать как аргумент find номер строки, которую команда должна вывести с ключом /n и затем найти. Замена апострофов на одинарные кавычки приводит к выводу самой строки find /n "10" text.txt.
Поэтому получилось сделать только так:

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
goto :start
 
:count
rem - найдем 10-ю строку
set /a str=10
rem - инкрементируем переменную
set /a num=%num%+1
if %num%==%str% (
rem запишем строку в файл
echo %1>string.txt)
goto:eof
 
:start
set /a num=0
for /f "delims=" %%i in (environment.txt) do (call :count "%%i")
rem - выведем число строк
echo Count string=%num%
pause
goto:eof
PS: Вариант с find было бы интересно и самому увидеть.

Добавлено через 4 часа 30 минут
А вот и вариант с find:
Windows Batch file
1
2
3
@echo off
for /f "usebackq  delims=" %%i in (`find /n /v "" environment.txt ^| find "[2]"`) do (echo "%%i")
pause
[2] - это нужный номер строки.
Несколько неакадемично, но зато работает.
Поясню: find сначала находит все строки файла в которых нет "", в итоге перебирает полностью все строки и проставляет им номера, а затем передает все это самой же себе, и уже в новом варианте ищет указанный в шаблоне номер строки. Таким образом мы получаем строку по ее номеру. Лишние символы [номер] в начале строки думаю нетрудно убрать.
PS:наконец то понял почему у меня cmd иногда глючит и начинает бесконечно вызываться - нефиг обзывать батники именами командных утилит из system32
4
Ris
791 / 173 / 9
Регистрация: 11.01.2011
Сообщений: 543
31.03.2011, 09:56 3
Нетрудно, но я всё-таки напишу:
Windows Batch file
1
2
3
@echo off
for /f "usebackq  delims=" %%i in (`find /n /v "" %1 ^| find "[%2]"`) do (for /f "tokens=1*" %%a in ('echo %%i') do (echo %%b))
pause
*Заменил название файла(и путь) на первый аргумент(%1), а номер строки на второй(%2).

Кстати, большое спасибо очень нужная и компактная программа! =)
2
erlik
134 / 106 / 8
Регистрация: 09.03.2010
Сообщений: 150
31.03.2011, 11:46 4
Ris
Да не за что. Сам пока тренируюсь.
-----------------------------------------------------------------------------
Интерактивный вариант сценария: (лишние символы при выводе искомой строки убираются)
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off
:start
rem переход в папку батника - нужно для запуска из командной строки - чтобы полный путь до файла, в котором ищется строка, не указывать 
cd /d %~dp0
cls
rem ввести имя файла
set /p name=ENTER FILENAME:
rem ввести номер строки
set /p number=ENTER NUMBER STRING:
for /f "usebackq  delims=" %%i in (`find /n /v "" %name% ^| find "[%number%]"`) do (set str=%%i)
rem пропуск лишних символов в начале строки
for /f "delims=] tokens=2" %%i in ("%str%") do (set str=%%i) 
echo %str%
echo.
set /p continue=YOU WANT TO CONTINUE? [y\n]:
if "%continue%"=="y" goto start
exit
2
Ris
791 / 173 / 9
Регистрация: 11.01.2011
Сообщений: 543
02.04.2011, 09:38 5
Кстати, есть намного проще и быстрее вариант:
Windows Batch file
1
for /f "tokens=*" %%i in ('more +Номер "Файл"') do (echo %%i&pause&exit)
Оставлю за собой последнее слово=)
2
erlik
134 / 106 / 8
Регистрация: 09.03.2010
Сообщений: 150
02.04.2011, 11:36 6
Отлично
Похоже даже препод, который давал данное задание не знал о таком простом варианте.
И я тоже хотя more пользовался, но только для ограничения вывода большого текста, и не обращал внимания на список ключей данной команды.
1
Nadia94
0 / 0 / 0
Регистрация: 02.10.2010
Сообщений: 34
02.04.2011, 21:34  [ТС] 7
вот еще задачу дали. "Получить список файлов, в первой строке которых есть заданное слова"

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
@echo off
setlocal enabledelayedexpansion
for %%f in (*.txt) do (
set /a count=0
for /F "tokens=*" %%i IN (%%f) DO (
if !count!==0 set s=%%i
set /a count=count+1
)
@echo !s!
@echo %%f >> files.txt
)
@echo on
но у меня получается только строки выводить, в окторых есть слово, а как сделать так, чтобы выводились названия файлов? помогите, пожалуйста
0
Ris
791 / 173 / 9
Регистрация: 11.01.2011
Сообщений: 543
03.04.2011, 12:56 8
"заданное слова" интересно: кто не русский Вы или тот кто давал задание...(извините, это я так шучу)
Код
for %%f in (*.txt) do (
- А у Вас, все файлы TXT проверяются, я бы поставил:
Код
for %%f in ('dir /a /b *.txt') do (
Хотя знаете, я вообще ваш код не понимаю, я думаю - он не должен, вообще работать, по-моему он просто выводит первую строку, без любой проверки =)

*Так, я думаю, счетчик здесь не нужен, так как 1-ая строка - она всегда 1-ая, просто после этого надо останавливать FOR или вообще без FOR.
Код
for /f "tokens=*" %%i IN ('type *.txt') DO (If "%%i"=="СЛОВО" echo %%~dpnxi>>list.txt)
Не проверял, всё времени нет...
1
Nadia94
0 / 0 / 0
Регистрация: 02.10.2010
Сообщений: 34
04.04.2011, 11:26  [ТС] 9
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@echo off
:start
rem переход в папку батника - нужно для запуска из командной строки - чтобы полный путь до файла, в котором ищется строка, не указывать 
cd /d %~dp0
cls
rem ввести слово
set /p word=ENTER WORD:
for %%f in ('dir /a /b *.txt') do (
set /a count=0
for /f "tokens=*" %%i IN ('type *.txt') DO (If "%%i"==%word% echo %%~dpnxi>>list.txt)
if !count!==0 set s=%%i
set /a count=count+1
)
@echo !s!
@echo %%f >> files.txt
)
echo.
set /p continue=YOU WANT TO CONTINUE? [y\n]:
if "%continue%"=="y" goto start
exit
я написала. но выдает в командной строке список всех проверяемых файлов, а в files.txt пишет почему-то %f. подскажите, пожалуйста, что не так?
0
Ris
791 / 173 / 9
Регистрация: 11.01.2011
Сообщений: 543
04.04.2011, 12:27 10
Так, мне кажется без setlocal enabledelayedexpansion нельзя использовать !переменная!...А эта команда, вроде, подразумевает закрываться командой endlocal (перед выходом)...
И вообще Вы не удачно соединяете наши коды =)
0
erlik
134 / 106 / 8
Регистрация: 09.03.2010
Сообщений: 150
10.04.2011, 12:54 11
Сделал вот такой вариант для поиска в группе файлов определенного слова в определенной строке.
Данные для поиска вводятся в интерактивном виде.
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
chcp 1251
cd /d %~dp0
rem - файл для записи результатов поиска - пишутся имена файлов, а на экран выводятся имена файлов и найденные строки
setlocal
set /p file=File for record of results:
rem - каталог, который смотрим -  рекурсивно со всеми подкаталогами
set /p sPath=The catalog for search:
rem - слово, которое ищем
set /p string=Word for search:
rem - номер строки в файле для поиска
set /p number=Line number for search:
 
for /r "%sPath%" %%i in (*) do (
for /f "usebackq delims=" %%j in (`find /n /v "" "%%i" ^| findstr /i /r "^\[%number%\].*%string%."`) do ( echo %%i>>%file% & echo %%i %%j))
endlocal
chcp 866
pause
Работает конечно не шустро, но вряд ли можно сделать быстрее.
1
Teiz
0 / 0 / 0
Регистрация: 22.01.2012
Сообщений: 6
22.01.2012, 22:48 12
Доброго времени суток.
Слепил вот такую конструкцию по поиску и вытягиванию нужной строки:
Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
set name=file.txt
set /a num=600
:start
for /f "usebackq  delims=" %%i in (`find /n /v "" %name% ^| find "[%num%]"`) do (for /f "tokens=1*" %%a in ('echo %%i') do (echo %%b>>1.txt))
set /a num=%num%+1
if %num%==602 (goto:end) else (goto:start)
:end
pause
Она то работает, но можно както сделать так, что бы обойтись без if и прибавления единички к num. Думал както сделать через последовательный перебор значений, но никак не получается.
Типа:
Код
set num=600 601 602
for %%n in (%num%) do 
и так далее
Возможно ли сделать так?


Както само получилось , наверно чтото не дописал.
Windows Batch file
1
2
3
4
5
6
set name=file.txt
set num=487 488 489 490 491 492 493
for %%n in (%num%) do (
for /f "usebackq  delims=" %%i in (`find /n /v "" %name% ^| find "[%%n]"`) do (for /f "tokens=1*" %%a in ('echo %%i') do (echo %%b>>1.txt)
))
pause
0
Smith&Wesson
9 / 9 / 0
Регистрация: 05.05.2011
Сообщений: 66
10.02.2012, 15:01 13
Всем доброго времени суток! В продолжение темы, так сказать... Не давеча, возникла необходимость написать парсер некоего лог-файла, для собственных нужд. В общем, логика следующая:
- файл лога лежит на диске D:\BACKUP\pars.log (при этом, название его, динамически меняется каждый день, или логов может быть несколько...)
(в нём есть пять ключевых слов, по которым мне нужно сделать выборку: PM, ТS, TV, TI,TW) - я их поместил столбиком в файл findata.txt, таким образом, что бы каждому ключевому слову, соответствовал определённый номер строки от 1 до 5, который будет выступать одновременно, и счётчиком.
Дальше - стандартная процедура. Думаю пояснять не нужно.

Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
setlocal enableextensions enabledelayedexpansion
set "MYPATH=D:\BACKUP"
set "SOURSE=*.log"
Set /a "count=1"
goto start
:1
if %count%==5 goto end
set /a count=%count%+1
:start
for /f "usebackq  delims=" %%i in (`find /n /v "" findata.txt ^| find "[%count%]"`) do (set conf_id=%%i)
 
set conf_id=%conf_id:~3%      rem 'пропускаю [номер_строки] и вывожу только значение
set conf=%conf_id:~2,-1%      rem 'почему-то в конце, добавляется лишний пробел. Удаляю его.
 
echo ^ Encoding=Cp866^ >> "%conf%".log     rem 'записываю в "шапку" 
for /f "tokens=*" %%j in (D:\BACKUP\pars.log) do (
     (@echo %%j | FINDSTR /i "%conf_id%") && @echo %%j >> "%conf%".log)
echo ^CRC=63637^ >> "%conf%".log     rem 'записываю в конец файла.  
goto 1
:end
endlocal
exit
...в итоге, получаем 5 файлов, PM.log ... TI.log с выборкой необходимых строк.
* * *
Теперь о проблемах. Процедура:
Код
for /f "tokens=*" %%j in ("%MYPATH%%SOURSE%") do ( ...
не хочет работать с переменной расположения лога. Т.е. %MYPATH%%SOURSE% не раскрывается в D:\BACKUP\pars.log
И второе: в конце каждого создаваемого файла, каким-то образом дописываются две пустые строки.
Подскажите, где ошибка?
0
Динозаврик
0 / 0 / 1
Регистрация: 26.10.2010
Сообщений: 3
24.02.2012, 17:41 14
Пожалуйста, помогите написать батник:
нужно произвести поиск заданного файла в заданном каталоге, потом в найденном файле заменить все вхождения заданной подстроки на другую заданную подстроку. если файлов найдется несколько, то замену произвести в каждом

для поиска пишу такое:
Windows Batch file
1
2
3
@Echo Off
Where /r C:\Users\Tester\1 open.txt
pause
Но оно просто выводит найденные файлы на экран, как в каждом из них произвести замену?
0
Smith&Wesson
9 / 9 / 0
Регистрация: 05.05.2011
Сообщений: 66
28.02.2012, 19:06 15
Коменда Where - это фактически, просто поиск... Я думаю в вашем случае, можно попробовать привязаться к номеру искомой подстроки.
0
Динозаврик
0 / 0 / 1
Регистрация: 26.10.2010
Сообщений: 3
28.02.2012, 21:10 16
сделала вот так - не работает (во всех open.txt заменить 11 на 22)
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
@Echo Off
FOR /R "C:\Users\Tester\1" %%A in (open.txt) DO (for /f "tokens=*" %%a in ('more^<%%A') do call :_replace %%a
goto eof
:_replace
set i=%*
set i=%i:11=22%
del %%A
echo %i%»%%A
goto eof
:eofpause
)
Отдельно все, что в DO (), работает. то есть
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
@Echo Off
pause
for /f "tokens=*" %%o in ('more^<C:\Users\Tester\1\open.txt') do call :_replace %%o
goto eof
:_replace
set i=%*
set i=%i:11=22%
del C:\Users\Tester\1\open.txt
echo %i%»C:\Users\Tester\1\open.txt
goto eof
:eofpause
что в первом неправильно??
0
Smith&Wesson
9 / 9 / 0
Регистрация: 05.05.2011
Сообщений: 66
29.02.2012, 15:13 17
Не совсем понятно, что делает конструкция
Код
set i=%i:11=22%
во вторых, попробуйте set i=%*, заменить на
Код
set i=%~1
и уберите
Код
goto eof
:eofpause
приведите пожалуйста, пример подстроки в текстовике.
0
29.02.2012, 15:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.02.2012, 15:13

Как прочитать первую строку из текстового файла?
Есть текстовый файл, нужно сделать BATник который бы первую строку из...

Как вставить в каждую строку текстового файла символы?
Пожалуйста подскажите как bat файлик сделать, чтобы он в каждую строку...

Как вставить выводимый в результате выполнения команды DIR текст в заданную строку текстового файла?
Господа! ломаю голову, не могу перенести текст. Есть перечень имен файлов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru