批处理文件保留十行之一

时间:2008-11-29 12:50:48

标签: windows batch-file

我有一个包含n行的文件。 (n超过1亿)

我想输出一个只有10行中的1行的文件,我不能将文件分成十部分而只保留一部分,因为它必须更随机一点。后来我必须做一个统计分析,我不能在数据中产生强烈的偏见。)

我正在考虑读取文件和每条记录,如果记录号为mod 10则输出它。

约束是:

  • 这是一台Windows(很可能是硬化的)计算机,可能是XP Vista或Windows Server 2003。

  • 没有可用的开发工具

  • 没有网络,usb,cd-rom。不读外部通讯。

因此我在考虑Windows批处理文件(我不能假设PowerShell,并且可能已删除了vbscript)。目前正在查看FOR / F命令。 我仍然不是专家,我不知道如何实现这一点。

谢谢Paul的回答。 我重新格式化(使用Hosam帮助)将其放入批处理文件中的答案:

@echo off
setlocal   
findstr/N . inputFile| findstr ^[0-9]*0: >temporaryFile
FOR /F "tokens=1,* delims=: " %%i in (temporaryfile) do echo %%j > outputFile

感谢quux和Pax提供类似的替代解决方案。然而,在对较大文件进行快速测试后,Paul的答案大约快了8倍。我想评估(在SET中)有点慢,即使逻辑看起来很棒。

4 个答案:

答案 0 :(得分:6)

好的,我想我已经破解了它:

findstr/N . path-to-log-file | findstr ^[0-9]*0:

(使用findstr将行号添加到行的开头,然后再次只打印行号以零结尾的行)

所以你会得到10行中的一行,但是每行都有亚麻和冒号

如果我能想到一种使用命令行工具的方法,那么我会编辑这个答案:)

使用

删除行号和冒号
FOR /F "tokens=1,2* delims=: " %i in (file-with-linenumbers) do echo %j

保罗。

答案 1 :(得分:2)

这是一个小命令脚本,可以执行您想要的操作(完全打印出文件lines32.txt的每10行)。该文件(对于我的测试)保持1到32的数字,每行一个,输出为10,20,30。

@echo off
setlocal

set /a "n = 0"
for /f %%i in (lines32.txt) do call :fn %%i
endlocal
goto :eof

:fn
set /a "n = n + 1"
if not %n%==10 goto :eof
echo %1
set /a "n = 0"
goto :eof

自从糟糕的旧DOS日以来,Windows命令语言已经走了很多路。我仍然不认为这是对ksh或bash的匹配,但它做得不错。

答案 2 :(得分:1)

保罗有一个非常好的答案。通过添加重定向操作符,您可以将数据写入文件。

findstr /n . yourLogFile.txt | findstr ^[0-9]*0: > numberedFile.txt
for /f "tokens=1,2* delims=:" %i in (numberedFile.txt) do echo %j > smallFile.txt
del numberedFile.txt

如果从命令行运行,这将起作用。如果要将其放在批处理文件中,请将每个'%'字符替换为'%%'(以便%i将成为%% i,%j将为%% j,因为在批处理文件中'%'具有一个特殊的意义)。

答案 3 :(得分:1)

选择的答案可能需要很长时间才能处理,因为它必须处理整个文件两次。如果那个文件是数百万行... woosh。

这就是我想出的。它将简单地按顺序处理文件,打印每个第10行(以您喜欢的任何数字结束):

@ECHO OFF
SETLOCAL
SET lastdigit=7
SET linecounter=0
FOR /F "tokens=*" %%a IN (text.txt) DO CALL :picker %%a
ENDLOCAL
GOTO :eof

:picker
set line=%*
IF {%linecounter:~-1%} == {%lastdigit%} ECHO %linecounter% %line%
SET /a linecounter=%linecounter% + 1
GOTO :eof

每一行都有编号,从零开始。 %linenumberumber%以%lastdigit%结尾的任何行都会与控制台以及亚麻布一起回显。使用set /?看看我是怎么想出来的 {%linecounter:〜-1%}的东西(除了亚麻布的最后一位之外,它只是去除了所有东西)。