windows 使用单一窗口命令从文件中提取N行

643ylb08  于 2023-11-21  发布在  Windows
关注(0)|答案(9)|浏览(211)

有没有一种方法可以从一个文件中提取/复制第一个X行,并使用Windows命令提示符用一个命令将它们输入到另一个文件中?
我可以使用以下命令删除前X行:
more +X [file_containing data] > [file_to_export_data_to]
如果head命令可以工作,我想我可以这样做:
head -X [file_containing data] > [file_to_export_data_to]
但不幸的是,这并不起作用。
这将是伟大的,如果Windows有一个“少”命令,但再次没有运气。
我是一个完全的新手,当涉及到这方面的东西,所以我肯定我错过了一些明显的。我不想安装任何东西或使用命令提示符以外的东西。
谢谢

3pvhb19x

3pvhb19x1#

最简单的单命令解决方案是使用Powershell Get-Content。
N --行数。
从文件开头开始:

Get-Content -Head N file.txt

字符串
从文件结尾开始:

Get-Content -Tail N file.txt

inb24sb2

inb24sb22#

您可以从PowerShell. 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中包含的文件夹中:

**头. bat **

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


在命令行中,可以使用head input.txt 10 >output.txt
在批处理脚本中,可以使用call head input.txt 10 >output.txt
我选择不将输出文件作为参数,以防您只想将结果显示在屏幕上,而不是写入文件。

rkue9o1l

rkue9o1l3#

为了获得正确的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格式的文件),以正确的编码输出。

brgchamk

brgchamk4#

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

字符串
将提取standardwaffle.txtu:\junk.txt的前7行,因此在这里它是在一个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


提取standardwaffle.txtjunk.txt的前n
-是可选

  • 但是 * 这涉及到在你的机器上安装批处理。这是被你的“禁止安装”要求所禁止的吗?还是“安装”只意味着第三方工具?
n1bvdmb6

n1bvdmb65#

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

kse8i1jr

kse8i1jr6#

你可以使用这个:

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 "*****"

41zrol4v

41zrol4v7#

如果你想坚持使用简单的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

字符串

q9rjltbz

q9rjltbz8#

应该可以的

echo off
set /p n="Enter the number of rows (n): "
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "standardwaffle.txt"') do (if %%i leq %n% echo %%j)

字符串

vyu0f0g1

vyu0f0g19#

无需读取整个文件;只需从文件开头提取所需的行(头):

set file=<file>
set line=<required first few lines>
type nul > tmp & fc tmp "%file%" /lb %line% /t | find /v "*****" | more +2

字符串
从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上测试

相关问题