découpage de fichier

découpage de fichier - Shell/Batch - Programmation

Marsh Posté le 25-07-2007 à 19:15:19    

Bonjour,
 
je souhaiterai découper un fichier en plusieur fichiers, je m'explique :  
j'ai un fichier avec plusieurs lignes :  
0xxxxxxxxx
122xxxxxxx
322xxxxxxx
422xxxxxxx
122xxxxxxx
322xxxxxxx
422xxxxxxx
322xxxxxxx
422xxxxxxx
0555xxxxxx
123xxxxxxx
323xxxxxxx
423xxxxxxx
 
et je souhaiterai le découper en 2 fichiers de la façon suivante :  
1er fichier nommé 444:  
0444xxxxxx
122xxxxxxx
322xxxxxxx
422xxxxxxx
122xxxxxxx
322xxxxxxx
422xxxxxxx
322xxxxxxx
422xxxxxxx
2eme fichier nommé 555:
0555xxxxxx
123xxxxxxx
323xxxxxxx
423xxxxxxx
 
pourriez-vous m'aider svp,
merci bcp d'avance.

Reply

Marsh Posté le 25-07-2007 à 19:15:19   

Reply

Marsh Posté le 25-07-2007 à 21:15:30    

Peux tu expliciter quelle logique suit le découpage.
 
Jean-Pierre.

Reply

Marsh Posté le 26-07-2007 à 10:36:23    

Désolé, j'ai été un peu vite car je n'avais pas le temps d'expliquer plus en détaille hier.
 
en fait je dois découper mon fichier en fonction du premier caractère de chaque ligne. A chaque fois que je rencontre un 0 je dois créer un nouveau fichier (il sera nommé avec le 2ème,3eme et 4eme caractère de cette même ligne), insèrer cette même ligne dans le fichier créé et ensuite insèrer les lignes qui suivent jusqu'à rencontrer de nouveau 0 en début de ligne, et là, création d'un nouveau fichier, etc...
Merci à tous pour votre aide.

Reply

Marsh Posté le 26-07-2007 à 10:51:11    

Une possible solution avec awk :

awk '
   /^0/ {
      if (file != "" ) close(file);
      file = substr($0, 2, 3);
      next;
   }
   file {
      print $0 > file;
   }
' inputfile


 
Jean-Pierre.

Reply

Marsh Posté le 26-07-2007 à 19:50:07    

Merci Jean-Pierre,
 
c'est presque bon, il me manque la ligne avec le 0 en début de ligne
 
peux-tu me dire pourquoi?
merci.
 

Reply

Marsh Posté le 26-07-2007 à 23:26:38    

Il suffit de supprimer l'instruction next :

awk '  
   /^0/ {  
      if (file != "" ) close(file);  
      file = substr($0, 2, 3);  
    }  
   file {  
      print $0 > file;  
   }  
' inputfile


 
Jean-Pierre.

Reply

Marsh Posté le 27-07-2007 à 10:11:20    

Oui, je m'en suis apercu après avoir posté, merci bcp.
j'ai un dernier souci :  
j'ai inclus le awk dans un script qui utilise des variables.
dans ce script j'ai une variable "nomFic" que je souhaiterai concaténer pour la définition de la variable "file" du awk.
faire du genre : file = substr($0, 2, 3)||$nomFic;
mais ça ne marche pas, vous avez une idée, je vais continuer à chercher de mon coté.
 
Encore merci Jean-Pierre.
 

Reply

Marsh Posté le 27-07-2007 à 10:35:05    

Le plus propre est de définir une variable au niveau awk :

awk -v FileSuffix="$nomfic"  '  
   /^0/ {  
      if (file != "" ) close(file);  
      file = substr($0, 2, 3) FileSuffix;  
    }  
   file {  
      print $0 > file;  
   }  
' inputfile


 
Jean-Pierre.

Reply

Marsh Posté le 30-07-2007 à 16:25:21    

Merci bcp Jean-Pierre, ça fonctionne très bien, j'espère un jour pouvoir te faire concurence sur UNIX... c'est pas demain la veille.
 
Encore merci pour ton aide et ta disponibilité.

Reply

Marsh Posté le 30-07-2007 à 18:16:26    

oups j'ai encore une question,
En effet, cette manipulation fonctionne très bien lorsque l'on reste dans le même répertoire, mais si le repertoire cible des fichiers générés est différent du repertoire du fichier source, comme dois-je faire stp?
 
merci pour ta réponse.
 

Reply

Marsh Posté le 30-07-2007 à 18:16:26   

Reply

Marsh Posté le 30-07-2007 à 19:05:08    

Deux possibilités :
 

cd /path/to/result/dir/
awk -v FileSuffix="$nomfic"  '    
   BEGIN { if (FileDir !~ /\/$/) FileDir = FileDir "/" }
   /^0/ {    
      if (file != "" ) close(file);    
      file = substr($0, 2, 3) FileSuffix;    
    }    
   file {    
      print $0 > file;    
   }    
' /path/to/inputfile


Ou:

awk -v FileSuffix="$nomfic"  -v FileDir='/path/to/result/dir/ '    
   BEGIN { if (FileDir !~ /\/$/) FileDir = FileDir "/" }
   /^0/ {    
      if (file != "" ) close(file);    
      file = FileDir substr($0, 2, 3) FileSuffix;    
    }    
   file {    
      print $0 > file;    
   }    
' inputfile


 
Jean-Pierre.


Message édité par aigles le 31-07-2007 à 08:43:25
Reply

Marsh Posté le 06-08-2007 à 10:47:40    

Merci bcp, ça marche très bien.
Désolé de la réponse tardive, mais les vacances passent avant tout.
merci encore.
à bientôt.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed