éditer un fichier

Fermé
merci - 7 oct. 2009 à 00:35
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 11 oct. 2009 à 08:55
Bonjour,

je veu écrit un script bash pour répérer dans le fichier suivant les chiffres en gras.En effet j'ai pensé à l'utilisation de sed et de AWK mais pour l'instant jarrive à récupéré les chiffres en bloque.mais un a un et par trie je n'y arrive.pourriez vous m'aider je pense qu'un eoption de sed doit pouvoir récupéré les valeurs de la première mais j'ai souvenance ou si quelqu'un a une autre proposition qu'il mele propose.

MeshVersionFormatted 0
Dimension 2
Vertices 4
16 -1 -1 1
1 1 -1 2
1 1 1 3
1 -1 1 4
Edges 4
1 2 1
2 3 1
3 4 2
4 1 2
partie à copier 4
1 2 1
2 3 1
3 4 2
4 1 2

hVertices 
0.666 0.666 0.666 0.666


merci pour votre aide
A voir également:

8 réponses

mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
7 oct. 2009 à 02:17
Il faudrait que tu nous expliques un peu plus clairement comment pourquoi tel ou tel nombre est extrait (est-ce sur sa position, sur sa valeur etc...).

Je ne fais pas forcément beaucoup de shell mais dans ton cas il faut à mon avis lire le fichier ligne par ligne et selon la section appliquer un outil (sed cut etc...).
https://forums.commentcamarche.net/forum/affich-37620017-comment-lire-un-fichier-ligne-par-ligne

Pour la première section il suffit d'appliquer à la ligne courante(si le but est d'extraire le premier chiffre), en supposant que la ligne soit stockée dans la variable ligne :

val=`echo $ligne | cut -f1 -d' '`


Pour la seconde section, même principe en supposant qu'on soit basé sur la position. Si c'est sur des notions de min, max etc... tu peux utiliser l'instruction sort.

Pour la dernière enfin il faut encore une fois extraire les valeurs et les stocker je suppose dans un tableau :
http://www.trustonme.net

D'un point de vue strictement technique, si c'est toi qui choisis le format de fichier, je t'invite plutôt à t'orienter vers des fichiers xml pour lesquels la plupart des langages proposent des outils permettant d'en extraire facilement l'information. En effet le parseur sera sans doute plus aisé à écrire si ces fichiers servent d'en d'autres programmes et peuvent facilement être étendus s'il y a besoin de faire évoluer leur format et leur contenu.

Bonne chance
0
BJr,
merci bien,géniale.Pour un petite analyse je vois que cela devrait marché j'essaye et je te répond.
les critères d'extractions de ces valeurs sont bien le numéro de la ligne,la position sur la ligne et on peut mêm parlé de leur format(numérique)bon mais là il y a aussi d'autres valeurs numériques dans le fichier.
mais aussi il faudrait que je précise que ces lignes se trouve dans un fichier de configuration donc par defaut
le système donne un format à ce fichier de config.

Merci bien
A tout suite
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615 > merci
7 oct. 2009 à 13:59
hello
Ça ne devrait pas poser de problème avec awk, mais peux tu indiquer clairement quels sont les critères de sélection des nombres ?
0
merci > dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024
7 oct. 2009 à 18:17
ok.

En effet ces nombres sont dans un fichier de configuration.Donc il faudra réupérer ces nommbres(jèspère que ta vu le fichier il faudra récupéré uniquement les nombres qui sont en gras) et les envoyé dans un autre fichier.je pense que comme critère de sélection de ces nombres on peu se basé sur le numéro de la ligne et la position du nombre sur la ligne.

merci jatends vivement ton aide car jaime bien utlisé awk
0
mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
7 oct. 2009 à 11:12
Ok bah à coup de cut ça se fait facilement. C'est plus la gestion d'erreur (valeur incorrecte (par exemple non numérique) ou inexistante) qui pourrait poser problème. Sinon, dès que tu commences à faire des scripts un peu compliqués, python/ruby/perl sont de bonnes alternatives au shell (et portables).

Bonne chance
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
8 oct. 2009 à 08:00
en traitant un fichier, awk connait le numéro de ligne (variable NR) et le numéro de chaque champ de la ligne ($n), donc si je veux, par ex. afficher le 2ème nombre de la ligne 13 :
awk 'NR == 13 {print $2}' < fichier
0
ok je voi,merci et bcp merci je pense cela devrait marché avec cette commande.
ainsi pour récpéré l'élément 1 de la ligne 1
ensuite l'élément 2 de la ligne 2 .
et enfin je les envoie dans un fichiersauvegarde pour un autre traitement
je propose ce code :

awk 'NR == 1 {print $1}' < fichier > fichierbackup
awk 'NR == 2 {print $1}' < fichier >>fichierbackup



c'est je redirige la sortie des nombres récupéré dans un fichier de sauvegarde.

Merci de vérifier si c'est bon.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
8 oct. 2009 à 13:40
tu peux regrouper en une commande
awk 'NR == 1 {print $1} ; NR==2 {print $2}' < fichier > fichierbackup 
0
merci beaucoup.sa marche.
Mais j'ai eu un autre probléme auquel je navais pensé.En effet comme le fichier dans lequel on récupère les informations est un fichier de configuration, les données qu'il comporte ne sont pas statiques; ils sont dynamiques(les valeurs changes en fonctions des paramètres de config) maintenant là où c'est plu dur le nombre de ligne peut aussi varier.Dans l'exemple préccédent le premier nombre était à la ligne 13 alors kil se peu que ce nombre soit ala position 15 par exemple dans une autre config.Et il faudra que monscript me le récupère.
Alors ce à quoi jai pensé et que jéssai sans succès pour linstant c'est de paramètrer la valeur de ligne.
donc il faut un script pour lire au préalable dans le fichier et récupéré la valeur de la ligne en fonction d'un critère de mot retrouvé par exemple le mot : Vertices.

voici une deuxièmeconfiguration du fichier après dautres paramètres de config :

MeshVersionFormatted 0

Dimension
2

Identifier
"G=./examples/square/square_g.msh;1, Date: 09/10/06 13:55 08s"

Geometry
"./examples/square/square_g.msh"

Vertices

-1 -1 1
1 -1 2
1 1 3
-1 1 4
-0.333333333333 -1 1
0.333333333333 -1 1
1 -0.333333333333 1
1 0.333333333333 1

Edges
12
1 5 1
5 6 1
6 2 1
2 7 1
7 8 1
8 3 1
3 9 2
9 10 2
10 4 2
4 11 2
11 12 2
12 1 2

Triangles
18
10 15 16 1
4 11 10 1
13 15 11 1
3 9 16 1
16 14 8 1
10 16 9 1
15 14 16 1

SubDomainFromMesh
1
3 1 1 1

VertexOnGeometricVertex
4
 1 1
 2 2
 3 3
 4 4

VertexOnGeometricEdge
8
 5 1 0.333333333333
 6 1 0.666666666667
 7 2 0.333333333333
 8 2 0.666666666667
 9 3 0.333333333333
 10 3 0.666666666667
 11 4 0.333333333333
 12 4 0.666666666667

EdgeOnGeometricEdge
12
1 1
2 1
3 1
4 2
5 2
6 2
7 3
8 3

End



Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
9 oct. 2009 à 07:40
on peut faire :
- on supprimer les lignes vides
- on imprime le champ 1 de la ligne qui suit la ligne contenant Vertices
- on imprime le champ 2, 2 lignes après la ligne contenant Edges et le champ 3 pourTriangles
$ sed '/^$/d' < fichier | awk '/Vertices/ {getline ; print $1} ; /Edges/ {getline;getline ; print $2} ; /Triangles/ {getline;getline; print $3}'
-1
5
16
0
slt,

alors sa marche mais le problem que j'ai posé l'autre n'a toujours pas eu de solution j'ai assez beaucoup de test et modification sans solution.Alors je m'esplique.


voici le contenu du fichier sur lequel j'ai mes tests

MeshVersionFormatted 0
Dimension 2
Vertices 4
16 -1 -1 1
1 1 -1 2
1 1 1 3
1 -1 1 4
Edges 4
1 2 1
2 3 1
3 4 2
4 1 2
partie à copier 4
1 2 1
2 3 1
3 4 2
4 1 2

Ici le code qui jai mi dans un fichier script

sed '/^$/d' < ficessai | awk '/Vertices/ {getline ; print $1}' ;
sed '/^$/d' < ficessai | awk '/Vertices/ {getline;getline ; print $1}' ;
sed '/^$/d' < ficessai | awk '/Vertices/ {getline;getline;getline ; print $1}' ;
sed '/^$/d' < ficessai | awk '/Vertices/ {getline;getline;getline;getline ; print $1}' ;
sed '/^$/d' < ficessai | awk '/Vertices/ {getline;getline;getline;getline;getline ; print $1}' ;
sed '/^$/d' < ficessai | awk '/Edges/ {getline; print}' ;

et voici le resultats

16
1
1
1
Edges
1 2 1



Premier probleme : j'imagine qu'il ya une centaine de lignes après vertices serait on obligé d'écrir 100 fois cette ligne de code et pire faudra mettre 100 getline dans le code pour récupérer des infos sur la ligne 100 après vertices.

Deuxième probléme: le resultat attendu al'exécution de ce script n'ai pa celui obtenu. on devrait juste avoir le premier élément des quartes lignes qui suivent vertices mais comme j'ai écri le script quand il y avait cinq ligne après vertices mêm quand il y a 4 lignes maintenant il a extraire des ifnos sur la cinquième ligne après vertices d'où Edges vient sajouté. ce qui ne devrait pas êtr le cas car on doi avoir que des valeurs dans le resultat.

Merci d'y réfléchi avec moi.
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 oct. 2009 à 09:49
il faudrait que tu exprimes clairement ce que tu veux.
toutes les lignes entre Vertices et Edges ?
bien sur que le getline va bien pour quelques lignes, mais pas pour 100.
exemple, imprimer le champ 1 des lignes entre Vertices et Edges, qu'il y en ait 4 ou 2000
$ sed '/^$/d' < fichier | awk '/Vertices/,/Edges/ { if($1 ~ /[0-9]/)print $1}'
16
1
1
1
0
Merci c'est super Génial.Ce code marche à tous les coups pour l'instant.j'ai testé plusieurs fois et sur une multitude de config et ca marche mais je cotinue les tests pour m'assurer qu'il y a moins de bug.Et je tiendrai t'en informé.

voici un peu les résultats :

 fichier qui a servi de test est appelé ficessai dans mon script 


MeshVersionFormatted 0
Dimension 2
Vertices 4
16 -1 -1 1
1 1 -1 2
1 1 1 3
1 -1 1 4
Edges 4
1 2 1
2 3 1
3 4 2
4 1 2
Triangles
1 1 1
2 4 1
3 4 2
4 3 2

NB:je fais un backup dans mon script pour ne pas écraser le fichier original ficeesai

voici un module( la partie qui permet le récupération de données) du programme que je suis entrain d'écrire:

echo avez vous recuperer deja une fois les donnes du fichier square_O.msh de bamg
read a
if [ "$a" = "non" ]
then
touch fichierMatrix
touch backupsquare
cat ficessai > backupsquare
echo "#Vertices" >> fichierMatrix
sed '/^$/d' < backupsquare | awk '/Vertices/,/Edges/ { if($1 ~ /[0-9]/)print $1}'>> fichierMatrix
echo "#triangles" >> fichierMatrix
sed '/^$/d' < backupsquare | awk '/Triangles/,/SubDomainFromMesh/ { if($1 ~ /[0-9]/)print }' >> fichierMatrix
vim fichierMatrix
elif [ "$a" = "oui" ]
then
rm -f fichierMatrix
rm -f backupsquare
touch fichierMatrix
touch backupsquare
cat ficessai > backupsquare
echo "#vertices" >> fichierMatrix
sed '/^$/d' < backupsquare | awk '/Vertices/,/Edges/ { if($1 ~ /[0-9]/)print $1}'>> fichierMatrix
echo "#triangles" >> fichierMatrix
sed '/^$/d' < backupsquare | awk '/Triangles/,/SubDomainFromMesh/ { if($1 ~ /[0-9]/)print }' >> fichierMatrix
vim fichierMatrix
fi

<code>Resultats reidirigé vers le fichier du nom fichierMatrix 


#vertices
16
1
1
1
#triangles
1 2 1
2 3 1
3 4 2
4 1 2

</code>

Merci car j'avoue être satisfait pour l'instant.
Aussi une remarque j'ai bien envi de pouvoir auniveau de vertices par affiché en horizontale les resultats de l'extraction c'est à dire avoir : 16 1 1 1 . pour moi j'ai du retraité le fichier qui contient le resultat de l'extraction avec des jonglages de commandes en tre sed et awk encore.(j'aime bien sed awk et grap ils sont géniales)
Aurrais tu une solution plus optimale?

Merci bien
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 oct. 2009 à 10:08
Salut,

Pour gagner en temps et en précision...

D'après l'exemple de fichier dans ton message #9, quelles sont toutes les valeurs que tu veux récupérer exactement ?

Comme dans ton 1er message, merci de mettre en gras ces valeurs.

;-))
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 oct. 2009 à 14:04
pour afficher sur une seule ligne, on n'imprime un \n qu'en fin de traitement
$ sed '/^$/d' < fichier | awk '/Vertices/,/Edges/ { if($1 ~ /[0-9]/)printf("%s ", $1)} ; END {print ""}'
16 1 1 1 
$
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
10 oct. 2009 à 18:42
Le "sed" ne sert plus à grand chose dans ce cas là, non ? ;-)
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
11 oct. 2009 à 08:55
effectivement, mais dans le fichier exemple du post #9, les lignes vides complexifiaient l'utilisation de getline et le sed évitait un test dans awk...
du passé faisons table rase....plus facile en politique ..:-)
0