|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Salut,
je bute sur le pb suivant : un fichier 8.txt contient des centaines de lignes dans ce genre Code :
Avant d'envisager de placer ces variables à un emplacement précis d'un fichier (contenant lui aussi plusieurs centaines de lignes), j'aimerais au moins arriver à le faire dans un simple fichier vierge (z.txt) Après de nombreuses recherches, j'ai cru comprendre qu'il était préférable d'utiliser "while read ligne" plutot qu'une boucle "for i in 8.txt". Voilà où j'en suis pitoyablement arrivé : Code :
while read line ; do var=$line ; echo $var >> z.txt ; var= ; done < 8.txt J'ai vu par ailleurs un tas d'autres commandes, telles que perl, awk... et là je commence sérieusement à m'embrouiller. Est-ce que vous pourriez me donner une piste supplémentaire orientée vers la solution recherchée ? Merci |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
Code :
while read -r line ; do var="$line" ; printf "%s\n" "$var" >> z.txt ; var= ; done < 8.txt |
|
|
00
|
|
|
#3 |
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Ok, merci jlliagre ça marche bien. Néanmoins il reste un souci : comme dit plus haut, cette variable $var doit être également insérée dans un autre fichier (11.txt et non pas 9.txt comme dit plus haut).
Pour cela j'utilise sed car la variable doit apparaitre sous chaque ligne commençant par un mot-clé, voici grossomodo la commande à partir de ce que tu as proposé : Code :
while read -r line ; do var="$line" ; printf "%s\n" "$var" >> z.txt ; sed '/^Mot clé/s/$/\necho phrase1 "$var" phrase2/' 10.txt > 11.txt ; var= ; done < 8.txt Vois-tu une solution ? |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
La commande devient trop complexe pour tenir raisonnablement sur une seule ligne.
Remet çà en forme et envoie un exemple de fichier 10.txt. |
|
|
00
|
|
|
#5 | ||||||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Salut,
pour la mise en forme, j'ai tenté comme ceci dans un script Code :
Le fichier 10.txt, de n lignes, contient ce schéma : Code :
Code :
Le pb est donc qu'en lieu et place de "$vari" (variable var i), il y ait chaque fois la valeur qu'elle prend au fur et à mesure de l'exécution de la "boucle" while read line |
||||||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : juin 2007 Messages : 969 ![]() |
Peux tu envoyer un fichier 10.txt qui correspond au 8.txt original:
%Exp1%\Exp2\nom1 %Exp4%\nom2 %Exp2%\nom3 nom7 et le fichier 11.txt attendu avec ces données. |
|
|
00
|
|
|
#7 |
|
Membre habitué
![]() Inscription : janvier 2007 Messages : 148 ![]() |
un script awk n'est pas plus indiqué pour ce genre de traitement ?
|
|
|
00
|
|
|
#8 | |||||||||||||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
je regrette et sais que ça va compliquer la chose, mais je ne peux envoyer sur un forum public les fichiers originaux tels qu'ils sont, en effet ils contiennent des données nominatives personnelles, espérant que tu puisses le comprendre malgré l'exigeance de ma demande.
J'essaie de reprendre le pb plus clairement si tu es d'accord, car je pense que mes explications sont un peu brouillonnes : Le fichier 8.txt,comportant n lignes, et issu de diverses opérations de mise en forme d'une base de données désordonnée, contient ce schéma : Code :
Exemple : Code :
Code :
Code :
La "phrase1" du schéma du fichier 10.txt est donc : alors L'algorithme recherché est le suivant : Citation:
Exemple : Code :
Code :
|
|||||||||||||
|
|
00
|
|
|
#9 | ||||||||||
|
Membre habitué
![]() Inscription : janvier 2007 Messages : 148 ![]() |
Citation:
Tu as deux fichiers en entrée 8.txt et 10.txt : 8.txt : Code :
10.txt Code :
11.txt Code :
Citation:
- Si variable "%Paul%\Dupont" est succédé par le mot clé alors". - Si les données de la nouvelle ligne en dehor de la variable sont fixes. je verrais alors un truc comme ca : Code :
ps : je n'ai pas vu la différence entre le fichier 8.txt et z.txt de ton exemple |
||||||||||
|
|
00
|
|
|
#10 | |||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Citation:
Citation:
Je ne connais pas du tout le langage awk - bien qu'y ayant été initié il y a quelques années en fac - par contre je ne vois aucune référence au fichier 8.txt dans le script que tu proposes, c'est normal ? Citation:
|
|||
|
|
00
|
|
|
#11 | |||
|
Membre habitué
![]() Inscription : janvier 2007 Messages : 148 ![]() |
Citation:
Le awk prend en entré un flux, ici un fichier, et le lit ligne par ligne. Le traitement déclaré entre les quotes est un traitement fait pour chaque ligne. Avant de lire une ligne execution du bloc Pour chaque ligne lu execution des instructions contenues dans les balises suivantes Je commente : Code :
ATTENTION2 : dans le script il faut absolument que la chaine définit dan le block BEGIN : succede ne puisse pas être inclus dans la variableà récupérer, sinon l'indice obtenu est érroné. |
|||
|
|
00
|
|
|
#12 | |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 8 743 ![]() |
Citation:
![]()
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
|
00
|
|
|
#13 | ||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Citation:
sinon ça a l'air de fonctionner, à ceci près que le fichier 11.txt se présente comme ceci Citation:
- ce t avant $var (le t est en fait la dernière lettre du mot précédent $var dans la première ligne, ce n'est pas puisque le vrai mot-clé, mais une phrase de deux mots sans caractères spéciaux ; est-ce que ça peut correspondre à ton Attention2 ? - ces %s%s%s - dans la première ligne de 11.txt, il y a trois espaces entre $var et "alors", au lieu d'un, même chose entre $var et "est bien présent" pour la deuxième ligne de 11.txt |
||
|
|
00
|
|
|
#14 | ||
|
Membre habitué
![]() Inscription : janvier 2007 Messages : 148 ![]() |
On va y arriver
Code :
Bon courage |
||
|
|
00
|
|
|
#15 | |||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
je suis désolé, mais la dernière modif a généré un trop grand nombre d'erreur. Après avoir bataillé pour essayer de comprendre, j'ai opté pour une autre direction. Formulons le pb complètement autrement, et oublions quelques instants pierre, paul et leur antislash de malheur :
soit un fichier a.txt contenant On double les lignes du fichier a.txt et on les trie dans l'ordre pour qu'au final les mêmes lignes se succèdent : Citation:
Code :
Maintenant, pour rester dans l'esprit du problème initial, il reste deux choses à faire :
Bon par contre, je n'arrive pas à attraper les lignes paires ou impaires via sed. J'ai testé diverses combinaisons comme par exemple : Code :
sed '2,~2' s/^/puisque "/g' e.txt > f.txt Qu'est-ce que vous en pensez ? |
|||
|
|
00
|
|
|
#16 | ||
|
Membre habitué
![]() Inscription : janvier 2007 Messages : 148 ![]() |
J'ai enfin pu tester
Voila ca devrait mieux marcher : Code :
|
||
|
|
00
|
|
|
#17 | ||
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Ok, merci ça fonctionne avec "verifier que " et " est bien present"
Le pb c'est que ce sont des exemples et que ces expressions contiennent en réalité des >>, des \, des " et des % et on dirait que ça buggue Code :
|
||
|
|
00
|
|
|
#18 | ||||
|
Membre habitué
![]() Inscription : janvier 2007 Messages : 148 ![]() |
Les problème de syntaxe sont du au caractères spéciaux qui sont à protéger par le caractère \ (antislash)
Donc une chaine contenant " doit proteger son caractère : \" Ce qui donne : Code :
Les caractères que tu as sité : > et % ne sont pas a proteger. Sinon pour ce qui est de l'approche dite de pair/impair je trouve ca un peu trop bidouille, j'espere que ce n'est pas du code qui sera à maintenir =) Il y'a aussi la possibilité d'utiliser ton premier fichier 8.txt Tu sembles avoir toute les données en main Code :
|
||||
|
|
00
|
|
|
#19 |
|
Membre du Club
![]() Inscription : mars 2006 Messages : 158 ![]() |
Ecoute Delwyn, là je crois que c'est parfait
juste une dernière question si tu permets : par rapport à cette histoire de sed et de lignes paires et impaires, quelle aurait été la bonne syntaxe ? comment faire par exemple pour faire simple ajouter un Z à chaque début de ligne impaire d'un fichier ? c'est vraiment par curiosité et aussi parceque j'ai passé des heures dessus |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com