разбить текстовый файл на несколько текстовых файлов

Я изо всех сил старался понять очень похожий Вопрос StackOverflow, но я не могу ни на жизнь, чтобы предложенные решения gawk или split работали в моем случае.

У меня есть большой текстовый файл, состоящий из 288 предложений, каждое из которых имеет длину от 300 до 500 слов и состоит из разного количества абзацев (поэтому нет постоянного количества строк). Однако каждое предложение начинается с идентификатора следующего типа: --###-- или --####--. Нет закрывающего маркера, хотя я полагаю, что мог бы вставить его, выполнив поиск по регулярному выражению и заменив исходный файл, прежде чем разбить его на несколько файлов. Мне нужна коллекция из 288 отдельных текстовых файлов, каждый из которых назван числом между двумя дефисами. Если это немного упростит задачу, я могу легко разделить файл между предложениями, озаглавленными тремя цифрами, и предложениями, озаглавленными четырьмя цифрами.

Короче говоря, я хочу сделать это:

#! /bin/env bash or python

Split all_proposals.txt into 121.txt, 122.txt, etc.

Where all_proposals.txt consists of:

  --121--

  One Line Title of Proposal

  Followed by several paragraphs each on a line of variable length.

  Another paragraph for effect.

  --122--

  More lines indeterminate in number.

person John Laudun    schedule 18.06.2012    source источник
comment
Похоже, ваш вопрос: напишите, пожалуйста, этот код для меня, а не для этого Stack Overflow. Вы пробовали что-то, что не сработало?   -  person Ned Batchelder    schedule 19.06.2012
comment
/bin/env не является стандартным расположением. Вы хотите /usr/bin/env.   -  person William Pursell    schedule 19.06.2012
comment
@NedBatchelder: Предыдущие попытки включают, но не ограничиваются: csplit abstracts.txt '/--[0-9][0-9][0-9]--/' '{186}', csplit -f abs abstracts.txt '/--[0-9][0-9][0-9]--/' '{186}', awk '/--\d/ {f=1;c++} {print > "session."i}' abstracts.txt и gawk -vRS='\n--\[0-9]{3}--\n' -vprefix="file" '{print > prefix "ab-"NR".tx t"}' abstracts_no_id.txt ... так что да, я пробовал разные вещи, которые не работали.   -  person John Laudun    schedule 19.06.2012
comment
И это не включает четыре сценария Python, которые я пробовал, и сценарий bash, который я пробовал. Это также не включает в себя обращение к местным жителям за помощью. Я заранее признаю, что мои сценарии и командная строка довольно слабы.   -  person John Laudun    schedule 19.06.2012
comment
@WilliamPursell ... да, спасибо. Я просто притворялся там, так что, признаюсь, не обратил внимания.   -  person John Laudun    schedule 19.06.2012


Ответы (3)


Вы можете использовать перл:

#!/usr/bin/perl
open(FI,"file.txt");
read(FI,$_,10000000);
close(FI);
@arr = split('--###--');
$cnt=0;
for $c (@arr)
{
    open(FO,">$cnt.txt");
    print FO $c;
    close(FO);
    $cnt++;
}
person amaksr    schedule 18.06.2012
comment
Считает ли Perl split символы # заменой регулярных выражений для чисел, которые будут в файле? - person jdi; 19.06.2012
comment
Я заменил --###-- слишком утомительным --[0-9][0-9][0-9]--, и это сработало: у меня есть каталог, полный более мелких текстов. К этому можно добавить две вещи: во-первых, у них нет имени в заголовке, что не является преградой, и, во-вторых, Perl мне не знаком. - person John Laudun; 19.06.2012
comment
@user14664130 user14664130 -- Я надеюсь, что галочка за приближение меня к ответу по-прежнему имеет значение для вас, несмотря на то, что вопрос закрыт. (Мне жаль, что так мало людей нашли это полезным.) - person John Laudun; 20.06.2012

Просто задавайте имя выходного файла каждый раз, когда видите строку с заголовком:

awk '/--[0-9]*--/ {split( $0, a, "--" ); output=a[2]".txt" }
    { print > output }' all_proposals.txt

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

person William Pursell    schedule 18.06.2012
comment
Это самая удивительная часть awk, которую я когда-либо видел. Как и мои предыдущие попытки в awk, вывод является дубликатом исходного файла, но просто переименован с первым заголовком. Я чувствую, что есть какая-то важная часть информации, которую я упустил, что сделало бы проблему очевидной для кого-то. - person John Laudun; 20.06.2012

Вы можете решить эту проблему на Python, используя регулярные выражения всего в нескольких строках. Взгляните на документы;

Идея заключается в том, чтобы найти ваш идентификатор, который в этом случае может быть с выражением вроде

r'(--[0-9]*--)'

В частности, взгляните на re.split.

person arpd    schedule 18.06.2012
comment
У меня есть, хотя и предварительное, представление о модуле регулярных выражений, и я уже сталкивался с re.split раньше, поэтому я вижу, что могу прочитать файл как большую строку, а затем разбить его, используя шаблон регулярного выражения. В чем я еще не силен, так это в понимании того, как выполнить сценарий, записывая каждую из новых небольших строк в отдельные файлы. - person John Laudun; 19.06.2012