Разделение большого текстового файла каждые 100 строк и включая оригинальный заголовок (на Mac)

9690
Dan

Я ищу инструмент или скрипт (Textwrangler или Terminal), который может разбивать больший текстовый файл каждые 100 строк, начиная со строки 5 (первые 4 строки заголовка), и выводить отдельные файлы .txt, которые содержат исходный заголовок.

Например

вход:

File.txt line1 / line4 HEADER ... line5 / line265 DATA 

выход:

File_01.txt line1/line4 HEADER line5/line104 DATA  File_02.txt line1/line4 HEADER line5/line104 DATA  File_03.txt line1/line4 HEADER line5/line65 DATA 

Текстовый файл использует разрывы строк Windows (CR LF) в случае, если это имеет значение.

В настоящее время я делаю это вручную, поэтому любые предложения, которые могут сделать этот процесс более эффективным, очень приветствуются.

1

2 ответа на вопрос

5
Nifle
  1. Удалите заголовок и поместите его в отдельный файл header.txt.
  2. разделить данные с помощью split --lines=100 data.txt(это генерирует много файлов с 100 строками в них, каждый из которых называется xaa xab xac и т. д.)
  3. Затем добавьте заголовок к каждому файлу. for a in x??; do cat header.txt $a > $a.txt; doneВ результате ваши готовые файлы данных (с заголовками) будут вызыватьсяxaa.txt xab.txt xac.txt ...

Если объем данных настолько велик (или вы разбиваете на меньше строк), что xxx-файлов недостаточно, разделите четыре файла именованных файлов. В этом случае вставьте лишнее ?в forвышеизложенное.

Редактировать:
Для автоматизации извлечения заголовка используйте head -4 origdata.txt > header.txtдля извлечения первых четырех строк. Используйте, tail -n +4 origdata.txt > data.txtчтобы извлечь все, кроме первых четырех строк. Теперь у вас есть два файла, один с заголовком и один с данными. Не должно быть слишком сложно объединить это со сценарием. (У меня нет доступа к Bash сегодня)

Спасибо! Я должен был заменить «--lines = 100» на «-l 100», но кроме этого он работает как шарм. Однако в идеале я бы предпочел выполнение скрипта или однострочной команды, чтобы коллегам (не разбирающимся в компьютерах) было легче выполнять эти задачи в мое отсутствие. Dan 14 лет назад 0
@ Дэн - Вы можете поместить все это в сценарий с небольшим количеством возни. Смотрите мои правки, чтобы автоматизировать первую часть. Nifle 14 лет назад 0
Мне удалось собрать ваши предложения в сценарий. Я также определил несколько переменных для включения исходного имени файла в вывод. Вероятно, он содержит несколько ложных сценариев, так как я довольно новичок в этом, но он неплохо справляется. Еще раз спасибо! Dan 14 лет назад 0
3
Dan

Основываясь на ответе, предоставленном Nifle, я создал скрипт, который выполняет предложенные им команды, добавляет исходное имя файла к выводу и очищает временные файлы.

#!/bin/bash  FILE=$(ls -1 | grep filename.txt) NAME=$  head -4 $FILE > header.txt tail -n +5 $FILE > data.txt  split -l 100 data.txt  for a in x?? do cat header.txt $a > $NAME.$a.txt done  mv $FILE $NAME.orig.txt rm header.txt data.txt x?? 

И вуаля!