LINUX.ORG.RU

Помогите написать скриптик!


0

0

Всем привет! помогите написать скриптик... Есть один большой текстовый файл. вида

HEADER_WORD La-la-la lal-la-la . HEADER_WORD la -ka la bla bla bla . HEADER_WORD bla bla lbla bla blalb . ...

То есть сначала идет HEADER_WORD, потом несколько строк текста, потом строка из точки. Задача: разложить этот файл на кучу маленьких. Первый файл должен содержать: HEADER_WORD La-la-la lal-la-la . Второй: HEADER_WORD la -ka la bla bla bla .

Ну и так далее. Именоваться - как угодно 1, 2, 3 например и тп. Подскажите, как это сделать попроще и побыстрее, на шелле или перле или еще как... СПАСИБО ОГРОМНОЕ!

anonymous

hw.l:
%{
#include <stdio.h>
   extern FILE* yyout;
   void new_file()   
   {      
    char buf[256];      
    static int count = 0;
    sprintf(buf,"%d",++count);
    yyout = fopen(buf,"w");   
   }
%}
%option noyywrap
%x echo
%%
"HEADER_WORD" { new_file(); BEGIN(echo); ECHO; }
<echo>^"."+   { BEGIN(0); ECHO; }
<<EOF>>       { return 0; }
%%
int main()
{
  new_file();   
  yyrestart(stdin);
  yylex();
  return 0;
}

Компиляем:
flex -t hw.l >hw.c && gcc -o hw hw.c

Flogger_d
()

Вот разделение по HEADER_WORD (точки не учитываются):
---
$ cat HeaderWordSplit

#!/bin/bash
i=0
while read A; do
[ "$1" == "$A" ] && i=$[$i+1];
echo $A >> "$i"
done
---

Файл читается из стандартного потока ввода, в качестве параметра надо передать
это самое HEADER_WORD, например:

cat A | HeaderWordSplit HEAD

unDEFER ★★★★★
()
Ответ на: комментарий от unDEFER

Не знаю, что имел в виду автор, но блок должен заканчиваться строкой из точки (точек?) В блоке может встретиться HEADER_WORD, который в твоем случае порежет блок надвое... Нуж вводить состояние - после заголовка и после точки.

Flogger_d
()
Ответ на: комментарий от Flogger_d

> В блоке может встретиться HEADER_WORD, который в твоем случае порежет блок надвое...

Я знаю, поэтому и отметил, что точки не учитываются -- это пример -- кому надо, тот разберёться:
---
$ cat HeaderWordSplit

#!/bin/bash
i=0
read A
while read B; do
echo $A >> "$i"
[ "$2" == "$A" ] && [ "$1" == "$B" ] && i=$[$i+1];
A=$B
done
echo $A >> "$i"
---

Тогда программа принимает два параметра (начало и конец):
cat A | HeaderWordSplit HEAD .

Ну тут опять же не проверяется, начальный "HEAD" и конечный ".".
И между строками "." и "HEAD" ничего не должно быть.

Автор на самом деле не сообщил всей специфики задачи (в большинстве случаев думается будет достаточно первого варианта).

unDEFER ★★★★★
()

$ cat split.awk

#! /usr/bin/awk -f

BEGIN {
	fname=1
	flag=0
}
/^HEAD/ && flag == 0 {print > fname; flag=1; next}
flag == 1 {print > fname}
/^\.$/   {flag=0; close(fname);fname=fname+1; next}

_________________________________________________________________
Usage: 
cat data.txt | ./split.awk

anonymous
()
Ответ на: комментарий от anonymous

Блин, в первом посте почему-то переводы строк не проставились. Файл такого вида: ---- HEADER bla1 bla1 bla1 bla1 bla1 bla1 . HEADER bla2 bla2 bla2 bla2 bla2 bla2 . HEADER bla3 bla3 bla3 bla3 bla3 bla3 . ----

Результат работы скрипта: Файл 1: ---- HEADER bla1 bla1 bla1 bla1 bla1 bla1 . ---- Файл 2: --- HEADER bla2 bla2 bla2 bla2 bla2 bla2 . ---

Файл 3: --- HEADER bla3 bla3 bla3 bla3 bla3 bla3 . ---

anonymous
()
Ответ на: комментарий от anonymous

>Блин, в первом посте почему-то переводы строк не проставились.
Уже лучше ? :-) 

Вобщем тот скрипт на awk, что я запостил как 
anonymous (*) (28.06.2005 9:38:41) работает для след. файла

HEAD sdasdasd
blalaHEADsdasd asd asdasd
.HdasdaHEADasdasd sad/....
.
HEAD dsfsaewtqe asefasdf.HEADdsfsdf
...HEAD dsfsdf asdas
asdasd asdaszxvczxcz
.

И так далее

sdio ★★★★★
()
Ответ на: комментарий от anonymous

Всё равно непонятно, зачем в конце точка. Точнее, почему она спецсимвол. Или после последней точки может быть что-то ещё, что надо отрезать?

Eldhenn
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.