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