4

У меня есть большой текстовый файл, сгруппированный с отдельными заголовками, которые мне нужно разделить на отдельные файлы.

Например, файл имеет следующие заголовки:

--Heading 1--
some text
text

--Heading 2--
more text etc

--Heading 3--
asdf text

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

Таким образом, для примера, будет 3 файла.

Заголовок 1.txt:

--Heading 1--
some text
text

Заголовок 2.txt:

--Heading 2--
more text etc

Заголовок 3.txt:

--Heading 3--
asdf text

Кто-нибудь знает о Windows или Макс приложение / скрипт, который может сделать это?

Или, может быть, дать инструкции о том, как написать что-то подобное на языке программирования. Я не знаю Python или Java, но, возможно, сейчас самое время учиться. :)

Спасибо!

2 ответа2

3

Это не самый простой ответ, надеюсь, кто-то придумает что-нибудь более аккуратное. Я собрал небольшой скрипт, который будет делать это, который должен работать на Mac.

#!/bin/bash
NUMFILES=`grep '^--.*--' $1 | wc -l`
NUMFILES=$(($NUMFILES - 2))
csplit -k $1 '%^--.*--$%' '/^--.*--$/' "{$NUMFILES}" 
for file in `ls xx*`
do
        mv $file "`head -n1 $file | sed -e 's/--\(.*\)--/\1.txt/'`"
done

Это работает с использованием csplit чтобы нарезать файл. Четвертая строка в основном говорит: игнорируйте все до первой строки заголовка, а затем разделяйте заголовки после этого. Строки 2-3 определяют, сколько раз csplit должен разделить файл.

csplit называет свои выходные файлы xx, за которыми следует двузначное число. Последние 4 строки переименовывают все эти файлы во все, что находится в строке заголовка с удалением -- .

2

Вот "один лайнер" 8-]. Это похоже на то, что есть у Мартина. Это будет работать на вашем Mac. Просто откройте приложение "Терминал" и перейдите в каталог, содержащий myfile.txt

split -p '--.*--' myfile.txt FILE && for file in FILE*; do mv $file "$(head -1 $file | sed 's/--//g')".txt; done

PS. Убедитесь, что в каталоге нет файлов с именем FILE *. т.е. убедитесь, что ls FILE* ничего не показывает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .