couper un fichier à une ligne précise [BASH] - Shell/Batch - Programmation
Marsh Posté le 03-09-2013 à 15:06:05
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+,
Marsh Posté le 03-09-2013 à 18:12:36
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 . 
++ 
 
 
 
Marsh Posté le 03-09-2013 à 18:22:39
Si un seul gros fichier: 
| Code : 
 | 
 
Si un plusieurs fichiers: 
| Code : 
 | 
 
 
Après je n'ai pas tout compris.
Marsh Posté le 03-09-2013 à 18:52:29
| Citation : 
 | 
 
 
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 !
Marsh Posté le 03-09-2013 à 19:33:49
| 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+,
Marsh Posté le 04-09-2013 à 08:22:49
| gilou a écrit : 
 
 | 
Parfait, c'est exactement ce que je desirai ...
Je comprend nettement mieux la synthaxe awk du coup ...
Merci à vous.
| KPN001E1BBLA                 L60000TD720                                                                               $ | 
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
Marsh Posté le 04-09-2013 à 14:34:49
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+,
Marsh Posté le 21-06-2020 à 07:39:23
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 : 
 | 
Marsh Posté le 28-06-2020 à 11:51:24
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 : 
 | 
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+,
Marsh Posté le 02-09-2013 à 17:28:04
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