Вы можете сделать это с помощью Batch-файла, использующего пару сторонних программ .exe. Трюк состоит в перенаправлении файла в Stdin и Stdout подпрограммы, поэтому обработка файла может выполняться в подпрограмме, соответствующим образом перемещая указатель файла стандартных дескрипторов. Вы можете рассмотреть пример аналогичного метода в this post.
@echo off
setlocal EnableDelayedExpansion
if "%~1" equ ":ProcessFile" goto %1
set /A keep=50, delete=10
rem Invoke a subroutine to process the file via redirected Stdin and Stdout
rem use CMD /C so the loop inside it can be broken with EXIT /B
cmd /C call "%~F0" :ProcessFile <theFile.txt>> theFile.txt
goto :EOF
:ProcessFile
rem Initialize the process: preserve first N lines in Stdin
for /L %%i in (1,1,%keep%) do set /P "line="
rem ...and move Stdout file pointer to the same place
FilePointer 0 0 /C
FilePointer 1 %errorlevel%
rem Process the rest of lines in an endless loop
for /L %%_ in () do (
rem Read M lines without copy they (delete they)
rem (advance just Stdin file pointer)
for /L %%i in (1,1,%delete%) do set /P "line="
rem ...and read and copy the next N lines
rem (both Stdin and Stdout advance the same amount)
for /L %%i in (1,1,%keep%) do set /P "line=!line!"
rem Check for the EOF in Stdin after the last block copied
set "line="
set /P "line="
if not defined line (
rem EOF detected: truncate the Stdout file after the last written line
TruncateFile 1
rem ...and terminate
exit /B
)
)
Интересный аспект этого метода является то, что обработка достигается в тот же файл, то есть, процесс не требует дополнительного пространства для хранения выходного файла. Разделы данных перемещаются из одного места в другое место в том же файле, а в конце оставшееся пространство усекается. Конечно, этот метод уничтожает оригинальный файл, поэтому его следует скопировать перед использованием этой программы.
Вероятно, что этот код имеет ошибку в одной строке, деформированной в каждой секции, скопированной или удаленной, но гораздо проще запустить тест и соответствующим образом скорректировать значения. Я предлагаю вам создать файл с 4 или 5 разделами и использовать его для тестирования. Кроме того, для определения конца файла может потребоваться некоторая корректировка. Если вы опубликуете результаты, полученные в результате теста, я могу помочь вам исправить эти данные.
Вы можете прочитать дополнительное описание этого материала и загрузить вспомогательные программы FilePointer.exe и TruncateFile.exe по адресу this site.
Можете ли вы предоставить информацию о линиях, которые вы хотите исключить? Пример содержимого поможет. –
Согласен. Зная, что уникально в отношении строк, которые вы хотите исключить, какая-то последовательность, которая может использоваться для переключения желаемого и нежелательного, была бы чрезвычайно полезна. – rojo
Если вы просто хотите пропустить все первые 10 строк из 60 строк, то команда awk будет полезна. awk '{if (NR% 60> 10) {print $ _}}' < file name> –