我有一个大小为2.5 GB的日志文件。有没有办法使用Windows命令提示符将此文件拆分为较小的文件?
答案 0 :(得分:34)
如果您已安装Git for Windows,则应该安装Git Bash,因为Git附带了该工具。
在Git Bash中使用 split
命令拆分文件:
每个文件大小为500MB: split myLargeFile.txt -b 500m
进入每个10000行的文件: split myLargeFile.txt -l 10000
提示:
如果您没有Git / Git Bash,请下载https://git-scm.com/download
如果您丢失了Git Bash的快捷方式,则可以使用 C:\Program Files\Git\git-bash.exe
尽管如此,我还是很喜欢例子...
示例:
您可以在此图中看到 split
生成的文件被命名为xaa
,xab
,xac
等。>
这些名称由您可以指定的前缀和后缀组成。由于未指定前缀或后缀的外观,因此前缀默认为x
,后缀默认为两个字符的字母枚举。
另一个示例:
此示例演示
MySlice
(而不是默认的x
)-d
,aa
,ab
等的ac
标志)-a 5
告诉我我希望后缀为5位数字:答案 1 :(得分:1)
Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Set rs = CreateObject("ADODB.Recordset")
With rs
.Fields.Append "LineNumber", 4
.Fields.Append "Txt", 201, 5000
.Open
LineCount = 0
Do Until Inp.AtEndOfStream
LineCount = LineCount + 1
.AddNew
.Fields("LineNumber").value = LineCount
.Fields("Txt").value = Inp.readline
.UpDate
Loop
.Sort = "LineNumber ASC"
If LCase(Arg(1)) = "t" then
If LCase(Arg(2)) = "i" then
.filter = "LineNumber < " & LCase(Arg(3)) + 1
ElseIf LCase(Arg(2)) = "x" then
.filter = "LineNumber > " & LCase(Arg(3))
End If
ElseIf LCase(Arg(1)) = "b" then
If LCase(Arg(2)) = "i" then
.filter = "LineNumber > " & LineCount - LCase(Arg(3))
ElseIf LCase(Arg(2)) = "x" then
.filter = "LineNumber < " & LineCount - LCase(Arg(3)) + 1
End If
End If
Do While not .EOF
Outp.writeline .Fields("Txt").Value
.MoveNext
Loop
End With
<强>剪切强>
filter cut {t|b} {i|x} NumOfLines
从文件的顶部或底部剪切行数。
t - top of the file
b - bottom of the file
i - include n lines
x - exclude n lines
示例强>
cscript /nologo filter.vbs cut t i 5 < "%systemroot%\win.ini"
另一种方式输出5001+线,适合您的使用。这几乎没有使用任何记忆。
Do Until Inp.AtEndOfStream
Count = Count + 1
If count > 5000 then
OutP.WriteLine Inp.Readline
End If
Loop
答案 2 :(得分:1)
您可以使用第三方软件http://www.hjsplit.org/进行拆分,例如,输入最多9GB的内容,然后进行拆分,就我而言,我分别拆分了10 MB
答案 3 :(得分:1)
以下每500个代码拆分一个文件
@echo off
setlocal ENABLEDELAYEDEXPANSION
REM Edit this value to change the name of the file that needs splitting. Include the extension.
SET BFN=upload.txt
REM Edit this value to change the number of lines per file.
SET LPF=15000
REM Edit this value to change the name of each short file. It will be followed by a number indicating where it is in the list.
SET SFN=SplitFile
REM Do not change beyond this line.
SET SFX=%BFN:~-3%
SET /A LineNum=0
SET /A FileNum=1
For /F "delims==" %%l in (%BFN%) Do (
SET /A LineNum+=1
echo %%l >> %SFN%!FileNum!.%SFX%
if !LineNum! EQU !LPF! (
SET /A LineNum=0
SET /A FileNum+=1
)
)
endlocal
Pause
答案 4 :(得分:0)
当然有! Win CMD不仅可以分割文本文件,还可以做很多事情:)
将文本文件拆分为每个“最大”行的单独文件:
Split text file (max lines each):
: Initialize
set input=file.txt
set max=10000
set /a line=1 >nul
set /a file=1 >nul
set out=!file!_%input%
set /a max+=1 >nul
echo Number of lines in %input%:
find /c /v "" < %input%
: Split file
for /f "tokens=* delims=[" %i in ('type "%input%" ^| find /v /n ""') do (
if !line!==%max% (
set /a line=1 >nul
set /a file+=1 >nul
set out=!file!_%input%
echo Writing file: !out!
)
REM Write next file
set a=%i
set a=!a:*]=]!
echo:!a:~1!>>out!
set /a line+=1 >nul
)
如果以上代码挂起或崩溃,则此示例代码可以更快地拆分文件(通过将数据写入中间文件而不是将所有内容保留在内存中):
例如将7600行的文件分割为最大3000行的较小文件。
set
命令生成正则表达式字符串/模式文件,以将其馈送到/g
的{{1}}标志中list1.txt
\ [[0-9] \]
\ [[0-9] [0-9] \]
\ [[0-9] [0-9] [0-9] \]
\ [[0-2] [0-9] [0-9] [0-9] \]
list2.txt
\ [[3-5] [0-9] [0-9] [0-9] \]
list3.txt
\ [[6-9] [0-9] [0-9] [0-9] \]
findstr
type "%input%" | find /v /n "" | findstr /b /r /g:list1.txt > file1.txt type "%input%" | find /v /n "" | findstr /b /r /g:list2.txt > file2.txt type "%input%" | find /v /n "" | findstr /b /r /g:list3.txt > file3.txt
注释:
适用于领先的空白,空白行和空白行。
在Win 10 x64 CMD,4.4GB文本文件,5651982行上进行了测试。
答案 5 :(得分:-2)
您可以使用命令拆分执行此任务。 例如,此命令进入命令提示符
split YourLogFile.txt -b 500m
创建几个文件,每个文件的大小为500 MB。对于您的大小的文件,这将花费几分钟。您可以将输出文件(默认情况下称为&#34; xaa&#34;,&#34; xab&#34;,...等)重命名为* .txt,以便在您选择的编辑器中打开它。 / p>
确保检查命令的帮助文件。您还可以按行数拆分日志文件或更改输出文件的名称。
(在Windows 7 64位上测试)