|
Publicité | ||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : juillet 2009 Messages : 11 ![]() |
Reposté ailleurs :
http://www.developpez.net/forums/d78...e/#post4501971 Plop, J'aurai besoin de vos lumière j'ai pas trouvé grand chose sur le net pour ma problématique particulière alors je pose la question. J'ai un fichier de 3mo composé d'une seule ligne... ex (j'ai remplacé les espaces par des "_"): "30004SCT_TARTENPION________________00003FONTEN" et je dois rajouté des ";" à des emplacement fixes(au bout de 5 caractères j'insère ";" puis 20 caractères après ";" puis 5 caractères après ";" etc...) et au bout de 900 caractères je dois sauter à la ligne et recommencer l'insertion de ";". Ce qui doit me donner un fichier composé de 3000 lignes ayant cette tête : "30004;SCT_TARTENPION_________;_____;00003;FONTEN..." "55204;BLABLABLAET BLABLABLA___;-003-;00003;FONTEN..." J'ai pensé à sed ou awk mais je sais pas comment faire. Voila merci de m'avoir lu. Bye Dernière modification par mangalor ; 21/07/2009 à 16h35. Motif: Reposté ailleurs |
|
|
00
|
|
|
#2 |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 6 ![]() |
Salut,
peut etre as tu trouvé une solution depuis le temps mais bon, j'ai crée un petit shell qui semble fonctionner . Note: variables IN=<fichier a traiter> OUT=<fichier obtenu> #!/bin/ksh #Fonction qui met les separateurs dans le bloc de caractere function fctsed { res=$(echo $@ | sed "s/^\(.....\)\(....................\)\(.....\)/\1;\2;\3;/") chaine=$(echo $res | grep ';' | awk -F';' '{print $NF}') chaineok=$(echo $chaineok$res | grep ';' | awk -F';' '{for (i=1;i<NF;i++) printf $i";" }') if [ -n "$chaine" ] then fctsed $chaine fi } #Variables IN=trait.txt OUT=res.txt lenght_ligne=889 lenght_fic=$(cat $IN | wc -c) i=1 #Boucle principale qui cree chaque ligne du nouveau fichier while(( i < $lenght_fic )) do (( j = i + $lenght_ligne )) chaine="" chaineok="" fctsed $(cat $IN | cut -c${i}-${j} ) echo $chaineok >> $OUT (( i = i + $lenght_ligne + 1 )) done Dernière modification par sinamone ; 20/09/2009 à 15h43. Motif: suppression saut de ligne impromptu |
|
|
00
|
|
|
#3 |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 6 ![]() |
EN fait y a bien plus court !
#!/bin/ksh #Variables IN=trait.txt OUT=res.txt lenght_ligne=899 lenght_fic=$(cat $IN | wc -c) i=1 #Boucle principale qui cree chaque ligne du nouveau fichier while(( i < $lenght_fic )) do (( j = i + $lenght_ligne )) cat $IN | cut -c${i}-${j}\ | sed "s/\(.\{5\}\)\(.\{20\}\)\(.\{5\}\)/\1;\2;\3;/g" >> $OUT (( i = i + $lenght_ligne + 1 )) done |
|
|
00
|
|
|
#4 | ||
|
Invité de passage
![]() Inscription : juillet 2009 Messages : 11 ![]() |
Solution trouvé sur un fofo us(www.unix.com)
Merci à tous et comme ça pourrait être utile voici la solution finale En perl la boucle lit le fichier entré en variable et insert les caractères ";" puis le fin de ligne à 900. Une fois terminé on remplace par rien les 14 derniers caractères(qui commence par 0,1 ou 2) de chaque lignes et on balance ça dans un fichier "_traite", voilou. Code :
|
||
|
|
00
|
|
|
#5 |
![]() ![]() Idriss NeumannDéveloppeur en SSII et étudiant au CNAM Paris (ingénieur SI) Inscription : février 2009 Messages : 1 705 ![]() |
Salut.
Pourquoi avoir mis en délestage plutôt qu'en résolu ? (ça joue dans les recherches pour les autres membres).
__________________
modérateur rubriques Linux/Unix et chat
|
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Inscription : juillet 2009 Messages : 11 ![]() |
J'avais posté ici car je voulais au départ une solution utilisant les fonctions de base disponible sur Unix.
N'ayant pas de réponse j'ai reposté ailleurs(ici) en acceptant d'autres languages et j'ai donc placé ce port en délestage à ce moment. J'ai pu avoir une solution en ouvrant encore un post sur un fofo us(unix.com) et j'ai donc posté la solution dans mon 2e poste pour partager la solution. Enfin ayant posté une réponse a mon tout premier post j'ai aussi posté la solution pour info. En fait c'est la faute de Sinamone...lol Donc je fais quoi ? case je laisse en délestage et je fais rien, j'enlève le délestage et je vérifie la solution de sinamone je met résolu et je fais rien, jme gratte andcase @sinamone j'ai pas encore testé ta solution car celle que j'ai fonctionne mais ça devrait arriver si j'oublie pas... Dernière modification par mangalor ; 24/09/2009 à 11h38. |
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : juillet 2009 Messages : 11 ![]() |
Sinamone pourrais tu m'expliquer la commande sed que tu fais car je suis pas trés familier avec elle ?
sed "s/\(.\{5\}\)\(.\{20\}\)\(.\{5\}\)/\1;\2;\3;/g" J'y connais rien du tout mais je dirais tu créé 3 commande que tu lances et tu rajoute un ; Je dit ça car dans les faits j'ai 56 insertions de ; à faire mais avec des espacements différents de 5 et 20..... |
|
|
00
|
|
|
#8 |
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 6 ![]() |
Ha bon faut donc que tu ecrives les 50 champs a la main , nonnn !!
sed "s/\(.\{5\}\)\(.\{20\}\)\(.\{5\}\)/\1;\2;\3;/g" l'expression reguliere du sed signifie: " n'importe quel caractere " répété 5 fois puis " n'importe quel caractere " répété 20 fois puis " n'importe quel caractere " répété 5 fois ensuite on réecrit les 3 enregistrements séparés cette fois par des ";" IL faut donc que tu continues la suite de la meme facon Ex: sed "s/\(.\{5\}\)\(.\{20\}\)\(.\{5\}\)\(.\{60\}\)\(.\{45\}\)\(.\{2\}\)\(.\{67\}\)/\1;\2;\3;\4;\5;\6;\7;/g" Bon aller, petit cadeau maison #!/usr/bin/ksh LENGHT_FIELD="5 20 5 60 45 2 67" #liste qui definit la longueur des champs j=1 for i in $LENGHT_FIELD do EXPR=$EXPR"\(.\{$i\}\)" LIST_REC=$LIST_REC"\\\\$j;" (( j = $j + 1 )) done echo "sed \"s/$EXPR/$LIST_REC/g\"" |
|
|
00
|
|
|
#9 | ||
|
Invité régulier
![]() Inscription : septembre 2009 Messages : 6 ![]() |
Mon dernier post comporte une erreur.
ON ne peut pas utiliser plus de 9 enregistrements dans un sed. Voici donc ce qu'il faut faire pour contourner cela, en gardant la construction de la commande sed de facon dynamique. Ca devient compliqué mais cette fois c'est abouti et ca fonctionne !!! Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com