开发者

Splitting a concatenated file based on header text

开发者 https://www.devze.com 2023-01-29 23:34 出处:网络
I have a few very large files which are basically a concatenation of several small files and I need to split them into their constituent files.I also need to name the files the same as the original fi

I have a few very large files which are basically a concatenation of several small files and I need to split them into their constituent files. I also need to name the files the same as the original files.

For example the files QMAX123 and QMAX124 have been concatenated to:

;QMAX123 - Student

... file content ...

;QMAX124 - Course

... file content ...

I need to recreate the file QMAX123 as

;QMAX123 - Student

... file content ...

And QMAX124 as

;QMAX124 - Course

... file content ...

The original file's header ;QMAX<some number> is unique and only appears as a header in the file.

I used the script below to split the content of the files, but I haven't been able to adapt it to get the file names right.

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

So I can either adapt that开发者_Go百科 script to name the file correctly or I can rename the split files created using the script above based on the content of the file, whichever is easier.

I'm currently using cygwin bash (which has perl and awk) if that has any bearing on your answer.


The following Perl should do the trick

    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"  ;
      }
    }

Note it discards any input before a line with filename next unless defined $F ; You may care to generate an error or add a default file. Let me know and I can change it


With Awk, it's as simple as

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

精彩评论

暂无评论...
验证码 换一张
取 消