2

How to delete last n lines from file using batch script

I don't have any idea about batch files, I am writing batch file for the first time.

How should I write this batch file?

For Windows7

Try it for

<Project_Name>

    <Noter>
        <Common>
        <File>D:\Project_Name\Util.jar</File>
        <File>D:\Project_Name\Noter.bat</File>
        <File>D:Project_Name\Noter.xml</File>
        <File>D:Project_Name\Noter.jar</File>       
        </Common>

        <Project_Name>
            <File>D:\Util.bat</File>
            <File>D:\Util.xml</File>
            <File>D:\log.bat</File>
        </Project_Name>
    </Noter>
    <CCNET>
4

4 回答 4

4

这是删除最后 N 行的完整脚本

  • 计算总行数
  • 设置 Line = Line - N ,只保留处理行号
@echo OFF
setlocal EnableDelayedExpansion

set LINES=0
for /f "delims==" %%I in (infile.txt) do (
    set /a LINES=LINES+1    
)

echo Total Lines : %LINES%
echo.

:: n = 5 , last 5 line will ignore 
set /a LINES=LINES-5

call:PrintFirstNLine > output.txt

goto EOF

:PrintFirstNLine
set cur=0
for /f "delims==" %%I in (infile.txt) do (      
    echo %%I        
    ::echo !cur! : %%I      
    set /a cur=cur+1    
    if "!cur!"=="%LINES%" goto EOF
) 

:EOF 

exit /b

这里call:PrintFirstNLine > output.txt将以外部文件名作为output.txt给出输出

样本输入的输出

<Project_Name>      
<CBA_Notifier>      
    <Common>        
    <File>D:\CBA\CBA_Notifier\Project_Name\IPS-Util.jar</File>      
    <File>D:\CBA\CBA_Notifier\Project_Name\Notifier.bat</File>      
    <File>D:\CBA\CBA_Notifier\Project_Name\Notifier.xml</File>      
    <File>D:\CBA\CBA_Notifier\Project_Name\Notifier.jar</File>              
    </Common>       
    <Project_Name>      
        <File>D:\CBA\CBA_Notifier\IPS-Util.bat</File>   

删除最后 5 行

更新

:PrintFirstNLine
set cur=0
for /F "tokens=1* delims=]" %%I in ('type "infile.txt" ^| find /V /N ""') do (
   if "%%J"=="" (echo.) else (
        echo.%%J
        set /a cur=cur+1    
        )  

   if "!cur!"=="%LINES%" goto EOF
)
于 2012-09-10T07:30:57.943 回答
1

该脚本将接受 1 个参数,即要中继的文件,创建一个临时文件,然后用较短的文件替换原始文件。

@echo off
setlocal enabledelayedexpansion
set count=
for /f %%x in ('type %1 ^| find /c /v ""') do set /a lines=%%x-5
copy /y nul %tmp%\tmp.zzz > nul
for /f "tokens=*" %%x in ('type %1 ^| find /v ""') do (
  set /a count=count+1
  if !count! leq %lines% echo %%x>>%tmp%\tmp.zzz
)
move /y %tmp%\tmp.zzz %1 > nul

如果原始文件是 5 行或更少行,主输出例程将不会创建文件。为了解决这个问题,我使用copy /y null创建一个零字节文件。

如果您不想有一个空文件,只需删除该copy /y nul行,并将其替换为以下行:

if %lines% leq 0 del %1

您应该使用一种方法或另一种方法,否则 5 行或更少行的源文件将保持不变。(既没有替换也没有删除。)

于 2012-09-12T14:03:17.300 回答
0

从文件中删除最后几行,

1 从文件中复制所需的起始行,如 from- e:\original.txt 2 将它们粘贴到新文件中,如 - e:\new\newfile1.txt

代码感谢给我这个代码的人:记住如果你有动机,甚至血液hb = 6,一切都可以完成。但总是需要大自然的帮助,因为你是它的一部分

@echo off & setLocal enableDELAYedeXpansion set N= for /f "tokens=* delims= " %%a in (e:\4.txt) do ( set /a N+=1 if !N! gtr 264 goto :did

e:\new4.txt echo.%%a ) :did

如果您有 800 个文件,则使用 excel 为 800 制作代码,然后将其复制到记事本并使用 Ctrl+h 替换没有空格的空格。然后将文件重命名为 haha​​.bat 。在文件编号为 1.txt 2.txt 3.txt 等的文件夹中运行。任何询问者欢迎 Erkamaldev@gmail.com “Bharata 万岁”

于 2015-10-12T06:45:49.593 回答
0

一种编码较少的慢速方法:

set input=file.txt
set remove=7

for /f "delims=" %i in ('find /c /v "" ^< "%cd%\%input%"') do set lines=%i
set /a lines-=remove
for /l %i in (1,1,!lines!) do findstr /n . log.txt | findstr /b %i:

可能被重定向到一个文件。
每行都以行号为前缀;可以通过额外的编码删除。
我的答案中带有/g标志的更快版本:
如何在 Windows 中拆分大文本文件?

在 Win 10 CMD 中测试,文件大小为 577KB,7669 行。

于 2020-04-24T15:40:05.220 回答