2010-12-09 58 views
0

J'ai quelques fichiers très volumineux qui sont essentiellement une concaténation de plusieurs petits fichiers et je dois les diviser en leurs fichiers constitutifs. J'ai aussi besoin de nommer les fichiers de la même manière que les fichiers d'origine.Division d'un fichier concaténé basé sur le texte de l'en-tête

Par exemple, les fichiers QMAX123 et QMAX124 ont été concaténé à:

;QMAX123 - Student 

... file content ... 

;QMAX124 - Course 

... file content ... 

je dois recréer le fichier QMAX123 comme

;QMAX123 - Student 

... file content ... 

Et QMAX124 comme

;QMAX124 - Course 

... file content ... 

L'original l'en-tête du fichier ;QMAX<some number> est unique et n'apparaît que comme en-tête dans le fichier.

J'ai utilisé le script ci-dessous pour diviser le contenu des fichiers, mais je n'ai pas été capable de l'adapter pour obtenir les noms de fichiers corrects.

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

Je peux donc soit adapter ce script pour nommer le fichier correctement ou je peux renommer les fichiers créés à l'aide fendus le script ci-dessus en fonction du contenu du fichier, selon le plus facile. Je suis actuellement en train d'utiliser cygwin bash (qui a perl et awk) si cela a une influence sur votre réponse.

Répondre

1

Voici Perl devrait faire l'affaire

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

Notez qu'il élimine toute entrée avant une ligne avec le nom de fichier next unless defined $F ; Vous pouvez prendre soin de générer une erreur ou ajouter un fichier par défaut. Laissez-moi savoir et je peux changer

+0

semble assez proche, il est stripping l'en-tête de fichier si. Y a-t-il un changement que vous pouvez faire pour les préserver? – StevenWilkins

+0

Ah, je l'ai déjà compris, j'ai ajouté un «print $ F $ 1» à l'air libre. Merci pour l'aide – StevenWilkins

+0

Ok - Je n'étais pas clair si cela faisait partie du fichier, ou un peu de "colle". Je suis content que vous l'aillez compris. L'autre façon serait de se débarrasser du 'else' et de faire l'impression à chaque itération. – justintime

1

Avec awk, il est aussi simple que

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