é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
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
A voir également:
- éditer un fichier
- Fichier rar - Guide
- Fichier host - Guide
- Fichier iso - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
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
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 :
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
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
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
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
Bonne chance
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
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
awk 'NR == 13 {print $2}' < fichier
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 :
c'est je redirige la sortie des nombres récupéré dans un fichier de sauvegarde.
Merci de vérifier si c'est bon.
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.
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
8 oct. 2009 à 13:40
tu peux regrouper en une commande
awk 'NR == 1 {print $1} ; NR==2 {print $2}' < fichier > fichierbackup
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 :
Merci
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
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
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
- 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
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.
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.
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.
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
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
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
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 :
#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
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
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
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.
;-))
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.
;-))
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
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 $
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
10 oct. 2009 à 18:42
Le "sed" ne sert plus à grand chose dans ce cas là, non ? ;-)
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
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 ..:-)
du passé faisons table rase....plus facile en politique ..:-)
7 oct. 2009 à 08:21
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
7 oct. 2009 à 13:59
Ç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 ?
7 oct. 2009 à 18:17
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