Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1029 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [BASH] couper un fichier à une ligne précise

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[BASH] couper un fichier à une ligne précise

n°2201514
boobaka
Posté le 02-09-2013 à 17:28:04  profilanswer
 

Bonjour à tous,
j'ai un traitement a faire sur plusieurs gros fichiers .. Je cherche un moyen de couper un gros fichiers en plusieurs parties en fonction d'une ligne ( commencant par 0 exemple ).. qui se répète évidement ...
Je triture sed/awk/cut mais ne parviens pas a ce que je veux ...

 

Quelqu'un aurait une idée ?

 

Par avance merci.
++


Message édité par boobaka le 02-09-2013 à 17:28:49

---------------
www.google.fr  
mood
Publicité
Posté le 02-09-2013 à 17:28:04  profilanswer
 

n°2201626
gilou
Modérateur
Modzilla
Posté le 03-09-2013 à 15:06:05  profilanswer
 

En supposant que tu veuilles couper toute les 300 lignes par exemple, un truc comme ceci devrait le faire:
awk 'NR%300==1{file="./"(FILENAME)(++i)".txt"}{print > file}' sourceFile
et si tu veux découper chaque fois que tu rencontres un certain pattern, c'est
awk '/PATTERN/{file="./"(FILENAME)(++i)".txt"}{print > file}' sourceFile
 
A+,


Message édité par gilou le 03-09-2013 à 15:07:41

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2201648
boobaka
Posté le 03-09-2013 à 18:12:36  profilanswer
 

Merci l'ami.
Effectivement je ne suis pas aux nombres de lignes mais bien PATTERN ..
Concrètement ma ligne séparatrice sera un 0 en debit de ligne
 
Je pense lancer mon :
awk '/^0/{file="./"(FILENAME)(++i)".txt"}{print > file}' source.txt
 
J'ai un doute sur le print > file
si je ne met que {print file } j'a bien un echo avec mon noms de fichiers incrémentés
Si je colle le {print > file }, j'ai un  Fatal: l'expression de la redirection de « > » a une valeur nulle pour la chaîne
 
En tout cas la piste est toute tracée.
 
Merci encore .
++
 
 
 


---------------
www.google.fr  
n°2201650
roondar
Posté le 03-09-2013 à 18:22:39  profilanswer
 

Si un seul gros fichier:

Code :
  1. egrep ' ^0' fichier.txt > sortie.txt


Si un plusieurs fichiers:

Code :
  1. egrep ' ^0' *.txt > sortie.txt


 
Après je n'ai pas tout compris.

n°2201652
Profil sup​primé
Posté le 03-09-2013 à 18:52:29  answer
 

Citation :

Code :
  1. Fatal: l'expression de la redirection de « > » a une valeur nulle pour la chaîne



 
le première ligne du fichier commence-t-elle par «0» ?
sinon, ``file'' n'est pas initialisée.
 
le mieux, c'est de nous présenter un échantillon représentatif du fichier original, et de la sortie correspondante attendue.
 
 
Veuillez utiliser la balise CODE, s'il vous plaît !


Message édité par Profil supprimé le 03-09-2013 à 18:54:16
n°2201656
gilou
Modérateur
Modzilla
Posté le 03-09-2013 à 19:33:49  profilanswer
 

Citation :

Si je colle le {print > file }, j'ai un  Fatal: l'expression de la redirection de « > » a une valeur nulle pour la chaîne

C'est parce que file n'est pas initialisé avant de rencontrer le premier pattern. Il faut donc l'initialiser, par un truc style:
awk 'BEGIN{file="./"(FILENAME)"0.txt"}/PATTERN/{file="./"(FILENAME)(++i)".txt"}{print > file}' sourceFile  
A+,

Message cité 1 fois
Message édité par gilou le 03-09-2013 à 19:34:27

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2201691
boobaka
Posté le 04-09-2013 à 08:22:49  profilanswer
 

gilou a écrit :

Citation :

Si je colle le {print > file }, j'ai un  Fatal: l'expression de la redirection de « > » a une valeur nulle pour la chaîne


C'est parce que file n'est pas initialisé avant de rencontrer le premier pattern. Il faut donc l'initialiser, par un truc style:
awk 'BEGIN{file="./"(FILENAME)"0.txt"}/PATTERN/{file="./"(FILENAME)(++i)".txt"}{print > file}' sourceFile
A+,


Parfait, c'est exactement ce que je desirai ...
Je comprend nettement mieux la synthaxe awk du coup ...

 

Merci à vous.

KPN001E1BBLA                 L60000TD720                                                                               $
KTN0001F0000B350-D-51B0-B-0619-MBL06250G0000000000U0001Q600000000N00001                                                %
M905             04370                                                                                                 %
M905             01880                                                                                                 %
M1500            04690                                                                                                 %
M1500            02390                                                                                                 $
KEN00001B                                                                                                              %
0                                                                                                                      %
957550351B0                                                                                                            %
350-D-51B0-B-0619-MB                                                                                                   %
LM373A-C -SANS-SANS-95755 03   I: 000  A:0  D: 000  G:0                                                                %
C1D         1  590 *580  *INS0--     -D190-EJ                                                                          %
 2                                                                                                                     $
KTN0002F0000B350-G-51B0-B-0619-MBL06250G0000000000U0001Q600000000N00002                                                %
M905             01880                                                                                                 %
M905             04370                                                                                                 %
M953             00030                                                                                                 $
KEN00002B                                                                                                              %
0                                                                                                                      %
957550351B0                                                                                                            %
350-G-51B0-B-0619-MB                                                                                                   %
LM373A-C -SANS-SANS-95755 03   I: 000  A:0  D: 000  G:0                                                                %
C1D         1  590 *580  *INS0--     -D190-EJ                                                                          %
 2                                                                                                                     $
KTN0003F0000B350-H-51B0-B-0648-MBL06540G0000000000U0001Q600000000N00003                                                %
M905             03270                                                                                                 %
M2020            03270                                                                                                 $
KEN00003B                                                                                                              %
0                                                                                                                      %
957550351B0                                                                                                            %
350-H-51B0-B-0648-MB                                                                                                   %
LM373A-C -SANS-SANS-95755 03   I: 000  A:0  D: 000  G:0                                                                %
C1D         1  590 *580  *INS0--     -D190-EJ                                                                          %
 2                                                                                                                     $
KTN0004F0000B350-B-51B0-B-0648-MBL06540G0000000000U0001Q600000000N00004                                                %
M400             03270                                                                                                 %
M2010            04570                                                                                                 %
M2000            01970                                                                                                 $
KEN00004B                              


Pour info je devais couper ce gros fichier en une multitude a chaque fois que je tombais sur une ligne commençant par 0.
Merci à vous.

 

HFR powaa


Message édité par boobaka le 04-09-2013 à 08:23:30

---------------
www.google.fr  
n°2201742
gilou
Modérateur
Modzilla
Posté le 04-09-2013 à 14:34:49  profilanswer
 

Notes que si tu as beaucoup de trucs de ce style, ou des patterns un poil complexes, perl est bien plus adapté à ce genre de tache.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2356545
grandkoala
Posté le 21-06-2020 à 07:39:23  profilanswer
 

Bonjour,
 
Pour info, l'utilisation de FILENAME n'est pas possible dans le BEGIN, comme très bien indiqué sur https://www.cyberciti.biz/faq/how-t [...] inux-unix/

Citation :

The name of the current input file set in FILENAME variable.[...]However, FILENAME is undefined inside the BEGIN rule unless set by getline.


 
On peut utiliser ARGV[1] à la place dans notre cas..
Ce qui donne :

Code :
  1. awk 'BEGIN{file="./"ARGV[1]"0.txt"}/PATTERN/{file="./"ARGV[1](++i)".txt"}{print > file}' sourceFile

n°2356979
gilou
Modérateur
Modzilla
Posté le 28-06-2020 à 11:51:24  profilanswer
 

Oui, c'est juste.
En l’occurrence, c'est ceci que je voulais avoir comme réponse (parce que la gestion des noms de fichier résultat y est pas terrible):

Code :
  1. awk 'BEGIN{fname=ARGV[1]; sub(/\..*$/, "", fname); file=fname (i++) ".txt"} /PATTERN/{file=fname (i++) ".txt"} {print > file}'  sourceFile

A adapter selon ses besoins.
Par exemple en ayant file=fname "." (i++) ".txt"; ou autre schéma de nommage, ou en tenant compte du path, etc.
A+,


Message édité par gilou le 28-06-2020 à 12:32:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [BASH] couper un fichier à une ligne précise

 

Sujets relatifs
Readfile sur fichier de cache volumineux[bash] reprendre la main après une redirection de l'entrée standard
aller dans un pararagraphe à une position précise depuis un lien HTcréer un fichier xml et l'afficher dans un emplacement bien déterminé
Ouverture Terminal Linux + Ligne de commandexls erreur sur code "If Target =" lors d'insertion de ligne
Probleme JAVA en ligne de commandemkdir avec une espace dans le nom de fichier dans un script.
Grouper 2 fichier txt[PHP / JS] jquery file upload : retrouver nom du fichier uploadé ?
Plus de sujets relatifs à : [BASH] couper un fichier à une ligne précise


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR