2010-12-09 3 views
0

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

Например файлы QMAX123 и QMAX124 были сцеплены для:

;QMAX123 - Student 

... file content ... 

;QMAX124 - Course 

... file content ... 

Мне нужно обновить файл QMAX123 в

;QMAX123 - Student 

... file content ... 

И QMAX124 в

;QMAX124 - Course 

... file content ... 

Подлинник заголовок файла ;QMAX<some number> уникален и отображается только как заголовок в файле.

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

awk '/^;QMAX/{close("file"f);f++}{print $0 > "file"f}' <filename>

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

В настоящее время я использую cygwin bash (который имеет perl и awk), если это имеет какое-либо отношение к вашему ответу.

ответ

1

Следующий Perl должен сделать трюк

use warnings ; 
    use strict ; 

    my $F ; #will hold a filehandle 
    while (<>) { 
     if (/^; (\S+) /x) { 
     my $filename = $1 ; 
     open $F, '>' , $filename or die "can't open $filename " ; 
     } else { 
     next unless defined $F ; 
     print $F $_ or warn "can't write" ; 
     } 
    } 

Примечание она отбрасывает любой ввод до строки с именем файла next unless defined $F ; Вы можете заботиться, чтобы сгенерировать ошибку или добавить файл по умолчанию. Дайте мне знать, и я могу изменить его

+0

Выглядит довольно близко, это хотя зачистки заголовок файла. Есть ли изменения, которые вы можете сделать, чтобы их сохранить? – StevenWilkins 2010-12-09 18:08:12

1

С Awk, это так просто, как

awk '/^;QMAX/ {filename = substr($1,2)} {print >> filename}' input_file