我有一个有n行的文件。 (n超过1亿)
我只想输出一个只有10行中的1行的文件,我不能将文件分成十部分,只保留一部分,因为它必须更随机一些。 后来我不得不做一个统计分析,我不能在数据中造成强烈的偏见)。
我想读取文件,并为每个logging,如果logging号码模10然后输出它。
约束是:
这是一个Windows(可能是强化)电脑可能是XP Vista或Windows Server 2003。
没有可用的开发工具
没有networking,USB,光盘。 不要读取外部通信。
所以我想到了Windowsbatch file(我不能假设PowerShell,而VBScript可能已被删除)。 目前看FOR / F命令。 但我不是专家,我不知道如何实现这一目标。
谢谢你的回答。 我重新格式化(与Hosam帮助)的答案把它放在一个batch file:
@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提供了类似的替代解决scheme。 然而,在对较大文件进行快速testing之后,Paul的答案大概快了8倍。 我猜测(在SET中)的评估是很慢的,即使逻辑看起来很棒。
好吧,我想我已经破解了它:
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
保罗。
这里有一个小小的命令脚本,它可以完成你想要的任何事情(精确地说,每10行文件lines32.txt就可以打印出来)。 那个文件(对于我的测试)保持着从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
Windows命令语言自DOS旧时代以来已经相当成熟。 我仍然不认为这是一个ksh或bash的匹配,但它做了一个体面的工作。
保罗有一个非常好的答案。 通过添加重定向操作符,可以将数据写入文件。
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,因为在批处理文件中'%'一个特殊的含义)。
所选的答案可能需要很长时间来处理,因为它必须处理整个文件两次。 如果那个文件是数百万行… woosh。
这是我想出来的。 它将简单地沿着处理文件的顺序进行,打印每一行(以你喜欢的数字结尾):
@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
每行都从0开始编号。 其中%linenumber%以%lastdigit%结尾的任何行都会与控制台一起回显,以及绣制的行号。 使用set /? 看看我是怎么想出这个{%linecounter:〜-1%}的东西(它只是除了最后一个数字以外)。