Выведите n-ю строку из текстового файла, где 'n' - аргумент командной строки - PullRequest
4 голосов
/ 20 июня 2011

У меня есть простой текстовый файл с такими номерами, как:

12345
45678
34567
89101

Мне нужен пакет, который вернет n строку из этого файла.n должно быть взято из аргумента командной строки.

Я очень новичок в пакетном скриптинге, поэтому заранее спасибо за любую помощь по этому вопросу.

Ответы [ 7 ]

6 голосов
/ 20 июня 2011

Чтобы получить файл из n-й строки, вы можете использовать больше + n (для строки 1 n = 0).
Чтобы разделить остальную часть файла, вы можете использовать цикл FOR /F.

Это работает даже, если перед n-й строкой есть пустые строки.
Может потребоваться установить EOL для неиспользуемого символа или перевода строки (по умолчанию ;)

set "lineNr=%1"
set /a lineNr-=1
for /f "usebackq delims=" %%a in (`more +%lineNr% text.txt`) DO (
  echo %%a
  goto :leave
)
:leave
2 голосов
/ 20 июня 2011

Вы можете использовать расширение пакетного файла.

token.bat

 @echo off

 setlocal ENABLEDELAYEDEXPANSION
 set l=%1
 set c=0
 for /f "delims=" %%1 in ('type foo.txt') do (
   set /a c+=1 && if "!c!" equ "%l%" echo %%1%
 )

Если у вас есть файл, подобный следующему,

foo.txt

 AAAA
 BBBB
 CCCC
 DDDD

И укажите номер строки следующим образом

 token 3

Вы получите

CCCC

0 голосов
/ 26 апреля 2016

Основываясь на ответе Амита, я создал утилиту под названием snip.cmd .

ИСПОЛЬЗОВАНИЕ: snip ФАЙЛ-ЛИСТ FIRSTCHARACTER LASTCHARACTER

пример:

foo.txt

    //
    // File Checksum Integrity Verifier version 2.05.
    //
    77752e4c91ba96dcc6c2bb4bdcdbdec5 c:\users\lapinot\desktop\token.bat

snip foo.txt 3 0 33 приведет к 77752e4c91ba96dcc6c2bb4bdcdbdec5

Вот мой код для snipe.cmd (вы можете добавить snipe в вашу командную строку с помощьюкопирование snip.cmd в c: \ Windows \ System32) :

    @echo off
    :: USAGE
    :: snip <file> [Line - Starts at 0] [First Column - Start Count at 0] [Last Colum]


    set file=%1
    set line=%2
    set char1=%3
    set char2=%4

    for /f "usebackq delims=" %%a in (`more +%line% %file%`) DO (set findstringline=%%a& goto :nextstep)

    :nextstep
    echo echo %%findstringline:^~%char1%,%char2%%% > %temp%\result.bat
    %temp%\result.bat
    del %temp%\result.bat
    :EOF
    exit /b
0 голосов
/ 11 июня 2014

echo "enter the line number.."; read i; awk 'NR==$i' <file_name>;

0 голосов
/ 31 декабря 2013

Для поиска символа от N до Mth в строке № L --- Пример поиска метки


@echo off

REM Next line = Set command value to a file  OR  Just Choose Your File By Skipping The Line
vol E: > %temp%\justtmp.txt
REM  Vol E:  = Find Volume Lable Of Drive E

REM  Next Line to choose line line no. +0 = line no. 1 
for /f "usebackq delims=" %%a in (`more +0 %temp%\justtmp.txt`) DO (set findstringline=%%a& goto :nextstep)

:nextstep

REM  Next line to read nth to mth Character  here 22th Character to 40th Character
set result=%findstringline:~22,40%

echo %result%
pause
exit /b

Сохранить как найти label.cmd

Результатом будет ваш диск E Label

Наслаждайтесь

0 голосов
/ 26 октября 2012

+ 1 для решения Джеба ... Я не знал, что вы можете использовать команду more , чтобы пропустить такие строки!

Вот альтернативный метод, который я использую для получения определенной строки из файла (или из многострочного вывода другой программы):

@echo off
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "C:\SomeFile.txt"') do (
  if "%%a" equ "%1" echo.%%b
)

Я использую findstr / n. * "Path \ FileName.ext" , чтобы добавить номера строк и убедиться, что пустые строки не пропускаются циклом for.

Затем я устанавливаю "tokens = 1 * delims =:" , чтобы отделить номера строк от содержимого строк.

Наконец, я сравниваю текущий номер строки ( %% a ) со строкой, указанной параметром % 1 , и выводю содержимое строки ( %% b ) на матч.

0 голосов
/ 20 июня 2011

Вы можете использовать FOR /F с параметром skip:

@ECHO OFF
SET skip=%1
SET /A skip-=1
IF %skip% LSS 0 GOTO out
IF %skip% GTR 0 SET params="skip=%skip%"
FOR /F %params% %%L IN (<i>filename</i>) DO (SET "line=%%L"& GOTO out)
:out
ECHO %line%

Параметр skip означает, что цикл FOR /F должен пропустить указанное количество строк в начале. Параметр применяется только в том случае, если вы указали номер строки больше 1. Если вы укажете номер меньше единицы или не число, сценарий выведет пустую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...