Быстро удалить первые n строк из многих текстовых файлов - PullRequest
3 голосов
/ 19 августа 2010

Мне нужно создать выходной текстовый файл, удалив первые две строки входного файла.

На данный момент я использую sed "1,2d" input.txt> output.txt

Мне нужно сделать это для тысяч файлов, поэтому я использую python:

import os
for filename in somelist:
  os.system('sed "1,2d" %s-in.txt > %s-out.txt'%(filename,filename))

но это довольно медленно.

Мне нужно сохранить исходный файл, чтобы я не мог сидеть на месте.

Есть ли способ сделать это быстрее? Использование чего-то другого, кроме sed? Возможно, использовать какой-то другой язык сценариев, кроме python? Стоит ли писать короткую C-программу или доступ к записи файлов на диск может быть узким местом?

Ответы [ 3 ]

9 голосов
/ 19 августа 2010

Используйте tail. Сомневаюсь, что все может быть значительно быстрее:

tail -n +3 input.txt > output.txt

Оберните его в выбранную вами петлю. Но я действительно сомневаюсь, что sed на целую тонну медленнее - как вы говорите, дисковый ввод-вывод обычно является самым узким местом.

4 голосов
/ 19 августа 2010

Я думаю, что это будет быстрее, чем запускать sed:

import os
import shutil

path = '/some/path/to/files/'
for filename in os.listdir(path):
    basename, ext = os.path.splitext(filename)
    fullname = os.path.join(path, filename)
    newname = os.path.join(path, basename + '-out' + ext)
    with open(fullname) as read:
        #skip first two lines
        for n in xrange(2):
            read.readline()
        # hand the rest to shutil.copyfileobj
        with open(newname, 'w') as write:
            shutil.copyfileobj(read, write)
3 голосов
/ 19 августа 2010
for file in *.ext
do
    sed -i.bak -n '3,$p' $file 
done

или просто

sed -i.bak -n '3,$p' *.ext
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...