Витягнути середній розділ рядків текстового файлу?


17

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

У файлі близько 16000 рядків; Я хочу розділити його на чотири окремі файли (спочатку), щоб побачити, чи можу я їх завантажити.

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

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

Відповіді:


27

Якщо ви не хочете псувати, але все-таки це робите, використовуючи tailі head, є корисний спосіб викликати tailза допомогою підрахунку рядків з початку, а не до кінця:

tail -n +4001 yourfile | head -4000

... Але кращий автоматичний інструмент, створений тільки для розбиття файлів, називається ... split! Він також є частиною GNU coreutils, тому будь-яка нормальна система Linux повинна мати його. Ось як ви можете ним користуватися:

split -l 4000 yourInputFile thePrefixForOutputFiles

(Дивіться, man splitякщо сумніваєтесь.)


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


3
Мені подобається сед-шлях.
фанчина

Це не працює для мене, тому що sed не виходить. Він виводить рядки, які я хочу стягнути, але мені потрібно ctrl-c, і, як результат, я не можу перенаправити його у файл. Будь-яка пропозиція зробити його корисним?
Brent212

Зрозумів це! "sed -n" <start_line>, <end_line> w <output_file> '<input_file> "працює для мене.
Brent212

@ Brent212 Ще один варіант, який потрібно зауважити, - це також те, що ви можете передавати його в менше або перенаправляти вихід у файл.
Kyle s
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.