2015-02-05 3 views
-1

Я новичок в сообществе, так что несите меня. У меня есть текстовый файл с чуть более 2 миллионов строк. Файл имеет заголовок, 50 строк фактических данных, а затем 10 строк, показывающих один и тот же заголовок, номер страницы, дату и другую информацию, которую я не нуждаюсь в приложении, которое я использую для создания файла. и затем снова и снова.Сценарий для удаления заданного количества строк в текстовом файле?

Можно ли использовать скрипт для удаления 10 строк на каждые 50 строк?

+0

Можете ли вы предоставить информацию о линиях, которые вы хотите исключить? Пример содержимого поможет. –

+0

Согласен. Зная, что уникально в отношении строк, которые вы хотите исключить, какая-то последовательность, которая может использоваться для переключения желаемого и нежелательного, была бы чрезвычайно полезна. – rojo

+0

Если вы просто хотите пропустить все первые 10 строк из 60 строк, то команда awk будет полезна. awk '{if (NR% 60> 10) {print $ _}}' < file name> –

ответ

0

Вот awk скрипта, который посылает команду ed, который удаляет H # строк с T числа линий сохранились между каждой секцией заголовка:

awk -v sz="`cat file.txt | wc -l`" -v H=10 -v T=40 'BEGIN { 
    print "w" 
    idx=1 
    while(idx<sz) { 
    print idx "," idx+H-1 "d" 
    idx+=(H+T) 
    } 
}' | cat -n | sort -rn | cut -f2- | ed file.txt 

Здесь Н есть # строк заголовка, чтобы удалить, и T - это количество оставшихся строк до следующего раздела заголовка.

Трубопровод cat -n | sort -rn | cut -f2- - это трюк, чтобы отменить порядок вывода, производимого awk (последняя строка первая, вторая - вторая и т. Д.).

1

Вы можете сделать это с помощью 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.

Смежные вопросы