Извлечь среднюю часть строк из текстового файла?

17

Я пишу сценарий PHP для анализа большого текстового файла, чтобы сделать из него вставки базы данных. Однако на моем хосте файл слишком велик, и я достиг предела памяти для PHP.

Файл имеет около 16 000 строк; Я хочу разделить его на четыре отдельных файла (сначала), чтобы посмотреть, смогу ли я их загрузить.

Первая часть, которую я могу получить head -4000 file.txt. Средние секции немного сложнее - я думал о том, чтобы передать tailвывод в head( tail -4001 file.txt | head -4000 > section2.txt), но есть ли другой / лучший способ?

На самом деле моя логика испорчена - для второго раздела мне нужно что-то вроде tail -12001 file.txt | head - 4000, а затем уменьшить tailаргумент для следующих разделов. Я уже запутался! :П

user394
источник

Ответы:

27

Если вы не хотите запутаться, но по-прежнему делаете это с помощью tailи head, есть полезный способ вызова tailс использованием счетчика строк с начала, а не с конца:

tail -n +4001 yourfile | head -4000

... Но лучший, автоматический инструмент, созданный специально для разделения файлов, называется ... split! Это также часть GNU coreutils, поэтому она должна быть у любой нормальной системы Linux. Вот как вы можете использовать это:

split -l 4000 yourInputFile thePrefixForOutputFiles

(Смотрите, man splitесли сомневаетесь.)

rozcietrzewiacz
источник
19

Комбинирование головы и хвоста, как вы сделали, будет работать, но для этого я бы использовал sed

sed -n '1,4000p' input_file # print lines 1-4000 of input_file

Это позволяет вам решить вашу проблему с помощью быстрой функции оболочки

chunk_it(){
    step=4
    start=1
    end=$step
    for n in {1..4} ; do
        sed -n "${start},${end}p" "$1" > "$1".$start-$end
        let start+=$step
        let end+=$step
    done
}

chunk_it your_file

Теперь у вас есть your_file.1-4000 и yuor_file.4001-8000 и так далее.

Примечание: требуется bash

Sorpigal
источник
3
Мне нравится Sed Way.
Фанчина
Это не работает для меня, потому что sed не выходит. Он выводит строки, которые я хочу выводить, но мне нужно нажать ctrl-c, и в результате я не могу перенаправить его в файл. Любое предложение сделать его пригодным для использования?
Brent212
Догадаться! "sed -n '<start_line>, <end_line> w <output_file>' <input_file>" работает для меня.
Brent212
@ Brent212 Другой вариант, на который следует обратить внимание, это то, что вы также можете передать его в less или перенаправить вывод в файл.
Кайл с