【问题标题】:Echo the nth line from a text file where 'n' is a command line argument从文本文件中回显第 n 行,其中“n”是命令行参数
【发布时间】:2011-06-20 10:32:42
【问题描述】:

我有一个简单的文本文件,其中包含如下数字:

12345
45678
34567
89101

我需要一个能从该文件返回nth 行的批处理。 n 应取自命令行参数。

我对批处理脚本非常陌生,因此在此先感谢您提供的任何帮助。

【问题讨论】:

  • 这是 windows 还是 unix?

标签: batch-file


【解决方案1】:

第 n 行获取文件,您可以使用 more +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

【讨论】:

  • @jep,如何将eol 设置为换行符?
【解决方案2】:

您可以使用批处理文件扩展名。

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

【讨论】:

  • +1,你比我快,但为什么要把delims设置为` and n`?
  • 糟糕,我删除了“\n”。感谢您的通知。
  • 顺便说一句,您的版本从输出行中删除了所有!,有时还删除了^
  • 嗯,我不明白“为什么会这样”。
  • ! 被删除,因为延迟扩展已启用,只有禁用扩展您才能安全访问%%1 另请参阅Script to remove special characters from filenames
【解决方案3】:

您可以将FOR /Fskip 参数一起使用:

@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 (filename) DO (SET "line=%%L"& GOTO out)
:out
ECHO %line%

skip 参数表示FOR /F 循环必须在开头跳过指定的行数。该参数仅在您指定大于 1 的行号时应用。如果您指定小于 1 的数字或非数字,则脚本输出空字符串。

【讨论】:

    【解决方案4】:

    +1 为 Jeb 的解决方案...我没有意识到您可以使用 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) 在比赛中。

    【讨论】:

      【解决方案5】:

      在第 L 行中查找第 N 到第 M 个字符 --- 查找标签示例


      @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
      

      另存为查找标签.cmd

      结果将是您的 Drive E 标签

      享受

      【讨论】:

        【解决方案6】:

        根据 Amit 的回答,我制作了一个名为 snip.cmd 的实用程序。

        用法:剪切文件行第一个字符最后一个字符

        示例:

        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 代码(您可以通过将 snip.cmd 复制到 c:\Windows\System32 来将 snipe 添加到命令行)

            @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
        

        【讨论】:

          【解决方案7】:

          echo "enter the line number.."; read i; awk 'NR==$i' &lt;file_name&gt;;

          【讨论】:

          • 问题被标记为 [batch-file],因此您的解决方案不适合
          猜你喜欢
          • 1970-01-01
          • 2022-12-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多