使用单个Windows命令从文件中提取N行

时间:2015-01-13 22:32:31

标签: windows cmd command-prompt

有没有办法从文件中提取/复制第一行X行,并使用windows命令提示符使用单个命令将它们输入到另一个文件中?

我可以使用以下方法删除前X行数:
更多+ X [file_containing data]> [file_to_export_data_to]

如果头部命令有效,我想我可以这样做:
head -X [file_containing data]> [file_to_export_data_to]

但不幸的是,这不起作用。

如果Windows有一个更少的"那将是很好的。命令但又没有运气。

对于这些东西,我是一个完整的新手,所以我确定我错过了一些明显的东西。我不想安装任何东西或使用命令提示符以外的东西。

由于

8 个答案:

答案 0 :(得分:17)

您可以从cmd.exe控制台使用PowerShell:

 powershell -command "& {get-content input.txt|select-object -first 10}" >output.txt

您可以创建一个DOSKEY宏,以便在命令行中更容易使用:

doskey head=powershell -command "& {get-content $1|select-object -first $2}"

用法:

head input.txt 10 >output.txt

但是你不能在批处理脚本中使用DOSKEY宏。

您可以创建一个head.bat脚本,并将其放在PATH中包含的文件夹中:

<强> head.bat

@powershell -command "& {get-content %1|select-object -first %2}"

从命令行,您将使用head input.txt 10 >output.txt

在批处理脚本中,您可以使用call head input.txt 10 >output.txt

我选择不将输出文件作为参数,以防您只想将结果显示在屏幕上而不是写入文件。

答案 1 :(得分:17)

the simplest one-command solution is to use Powershell Get-Content.

N - number of lines.

From the begining of file:

Get-Content -Head N file.txt

From the end of file:

Get-Content -Tail N file.txt

答案 2 :(得分:2)

(@FOR /f "tokens=1* delims=:" %a IN ('findstr /n "^" "standardwaffle.txt"') DO @IF %a leq 7 ECHO(%b)>u:\junk.txt

会将standardwaffle.txt的前7行提取到u:\junk.txt,所以这里只有cmd行 - 但是我无法让你可靠地输入它。

它还会删除源代码行中的任何前导:

@ECHO OFF
SETLOCAL
IF %1 lss 0 (SET /a line=-%1) ELSE (SET /a line=%1)
FOR /f "tokens=1* delims=:" %%a IN ('findstr /n "^" "%~2"') DO IF %%a leq %line% ECHO(%%b

GOTO :EOF

此批次保存为head.bat放置在路径上的任何位置,您可以使用

head -n standardwaffle.txt >junk.txt

n的第standardwaffle.txt行提取到junk.txt

-是可选的

这涉及在您的计算机上安装批处理。这是否被你的&#34;没有安装&#34;要求,或者是&#34;安装&#34;仅适用于第三方实用程序?

答案 3 :(得分:1)

Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
x = 0
    Do Until Inp.AtEndOfStream
              x = x + 1
        OutP.WriteLine Inp.Readline
              If x = 5 then Exit Do
    Loop

这将打印第1至第5行。使用

cscript //nologo <path to script.vbs> <inputfile >outputfile

答案 4 :(得分:1)

为了获得正确的utf8输出,请在powershell中执行以下操作

chcp 65001

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding

get-content input.txt -encoding UTF8 |select-object -first 10000 > output.txt

这将首先输入10000行input.txt(utf8格式的文件)到output.txt,并且编码正确。

答案 5 :(得分:0)

你可以用这个:

break>"%temp%\empty"&&fc "%temp%\empty" "%file_to_process%" /lb  X /t |more +4 | findstr /B /E /V "*****"

你应该用你想要的行替换 X 。或者命名为head.bat

break>"%temp%\empty"&&fc "%temp%\empty" "%file_to_process%" /lb  %~1 /t |more +4 | findstr /B /E /V "*****"

答案 6 :(得分:0)

如果您想使用简单的Windows命令,可以使用它,但是对于大文件来说会有点慢;-)(我在下面添加了第二种解决方案,效果更好:-),它提取了最近的100条记录任何长度的文件)

find /n " " <test.txt >test.tmp
for /l %%i in (1,1,100) do find "[%%i]" <test.tmp >test.tmp2
for /f "delims=] tokens=2" %%i in (test.tmp2) do echo %%i >>test.new
del test.tmp
del test.tmp2
move /y test.new test.txt

find /v /n "" <test.txt >test.tmp
for /f "delims=: tokens=2 %%i in ('find /v /c "" test.txt') do set /a NR=%%i
set /a NS=%NR%-100
for /l %%i in (%NS%, 1, %NR%) do find "[%%i]" <test.tmp >>test.tmp2
for /f %%i "delims=] tokens=2 %%i in (test.tmp2) do echo %%i >>test.new
move /y test.new test.txt

答案 7 :(得分:0)

一个单行示例,用于从file.txt中提取前9行并将其写入nine.txt

for /f "tokens=* delims=[" %i in ('type "file.txt" ^| find /v /n "" ^| findstr /b /r \[[1-9]\]') do set a=%i& set a=!a:*]=]!& echo:!a:~1!>> nine.txt

保留空白行,以分号开头的行,前导空格,并保留定界符和空白。

在Win 10 x64 CMD上测试