Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1852 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[UNIX] GREP - SED

n°849785
Dion
Acceuil
Posté le 14-09-2004 à 11:25:07  profilanswer
 

Reprise du message précédent :

ls_one a écrit :

Et pour les cons mêmes pas foutus .....blabla
 
C quoi ? Un compliment peut être !
 
Stp, lit les topics en entier, à moins que tes facultés intellectuelles soient plus que limitées !


 
T'arrives kan même à gonfler le plus cool et le moins présent des modos, tu représentes uen perf à toi tout seul [:mlc]

mood
Publicité
Posté le 14-09-2004 à 11:25:07  profilanswer
 

n°849786
gilou
Modérateur
Modosaurus Rex
Posté le 14-09-2004 à 11:25:13  profilanswer
 

ls_one a écrit :

Vas y fait toi plaisir !

pas de pb, moi, les boulets, j'en fais pas collection.

Citation :

ls_one a été envoyé chez les TeleTubbies


A+,


Message édité par gilou le 14-09-2004 à 11:25:44

---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°849789
Cherrytree
cn=?
Posté le 14-09-2004 à 11:26:50  profilanswer
 

black_lord a écrit :

[:atsuko]
 
j'adore l'expression [:atsuko]


Je plusunte.
 

ls_one a écrit :

Et pour les cons mêmes pas foutus .....blabla
 
C quoi ? Un compliment peut être !
 
Stp, lit les topics en entier, à moins que tes facultés intellectuelles soient plus que limitées !


 :hello:


---------------
Le site de ma maman
n°849809
gilou
Modérateur
Modosaurus Rex
Posté le 14-09-2004 à 11:37:36  profilanswer
 

> Je plusunte
 
Reste plus qu'a creer une icone d'un bisounours tapant du code sur sa becane :)
 
A+,


---------------
There's more than what can be linked! --  Le capitaine qui ne veut pas obéir à la carte finira par obéir aux récifs. -- Il ne faut plus dire Sarkozy, mais Sarkozon -- (╯°□°)╯︵ ┻━┻
n°849831
Taz
bisounours-codeur
Posté le 14-09-2004 à 11:51:55  profilanswer
 

j'aime bien quand c'est les autres qui s'excitent [:alphat]  
 
 
 
 
 
 
ceci dit    [:tobrainc]

n°850481
matafan
Posté le 15-09-2004 à 05:29:00  profilanswer
 

N'empeche qu'on attend toujours ta solution utilisant tr.

n°850488
skeye
Posté le 15-09-2004 à 07:09:19  profilanswer
 

matafan a écrit :

N'empeche qu'on attend toujours ta solution utilisant tr.


Relis le topic. L'énoncé a changé en cours de route.


---------------
Can't buy what I want because it's free -
n°1343972
HokutoNoFr​ed
Posté le 11-04-2006 à 12:04:24  profilanswer
 

salut
 
j'essaye de faire automatiquement une opération sur un nombre, dans un fichier, mais je n'arrive pas à trouver le moyen exact
je pense que la commande sed (ou peut etre awk) est appropriée
 
en fait j'ai besoin d'augmenter (ou diminuer) la valeur d'un nombre, dans une ligne contentant un mot clé
 
par exemple :
 
dans la ligne       "TRUC  10.5"
je voudrais avoir  "TRUC  12.5"
 
puis avec la ligne            "TRUC 7.0"
je voudrais que ça donne  "TRUC  9.0"
 
etc...
 
je souhaite pouvoir automatiser cela avec la commande sed, car je dois procéder à ce remplacement à plusieurs reprises (à chaque occurence du mot-clé TRUC dans le fichier)
 
je sais substituer une chaine de caractère avec sed (via l'option s/) mais pas effectuer une opération  
 
qqn aurait une idée ? une autre commande ?


Message édité par HokutoNoFred le 11-04-2006 à 12:06:45
n°1343987
anapajari
s/travail/glanding on hfr/gs;
Posté le 11-04-2006 à 12:20:37  profilanswer
 

j'aurais tendance à mettre un bout de perl dedans pour simplifier l'utilisation de la regex(reste qu'elle est améliorable en fonction de ton problème):

Code :
  1. cat a.txt | perl -pe 's/TRUC ([\d|\.]+)/"TRUC ".($1+2)/e'


n°1343995
HokutoNoFr​ed
Posté le 11-04-2006 à 12:28:59  profilanswer
 

merci
 
je vais tester ça

mood
Publicité
Posté le 11-04-2006 à 12:28:59  profilanswer
 

n°1344077
HokutoNoFr​ed
Posté le 11-04-2006 à 13:55:10  profilanswer
 

hum c'est bizarre mais la commande n'a aucun effet sur mon fichier
 
il n'y a pas de message d'erreur, mais le fichier initial reste inchangé...
 
j'ai essayé d'appliquer le coeur de la commande perl, à la commande sed, mais cela ne change rien : aucun effet


Message édité par HokutoNoFred le 11-04-2006 à 14:01:09
n°1344087
franceso
Posté le 11-04-2006 à 14:04:21  profilanswer
 

la commande que t'a donnée anapajari, c'est juste pour sortir le contenu du fichier modifié. Après, tu peux rediriger la sortie vers un nouveau fichier :

cat a.txt | perl -pe 's/TRUC ([\d|\.]+)/"TRUC ".($1+2)/e' > b.txt


 tu trouveras dans b.txt le résultat que tu cherchais


---------------
TriScale innov
n°1344093
HokutoNoFr​ed
Posté le 11-04-2006 à 14:10:11  profilanswer
 

oui oui je comprend bien
j'ai redirigé l'instruction vers un fichier de sortie
 
mais celui-ci s'avère être identique à l'original
(je fais "sdiff -s entree.txt sortie.txt" et il n'y a pas de difference)


Message édité par HokutoNoFred le 11-04-2006 à 14:11:45
n°1344101
anapajari
s/travail/glanding on hfr/gs;
Posté le 11-04-2006 à 14:14:20  profilanswer
 

c'est la regex que tu as mis qui ne doit rien matcher! Montre ta commande exactement ( ainsi que la structure d'une ligne que tu dois matcher).
 
Avec le fichier :

TRUC 7.0
ABZ 9.0
TRUC 12.5
ABZ 22.0
TRUC 124.2


La commande que je t'ai donné plus haut produit:

TRUC 9.0
ABZ 9.0
TRUC 14.5
ABZ 22.0
TRUC 126.2


Message édité par anapajari le 11-04-2006 à 14:20:01
n°1344116
HokutoNoFr​ed
Posté le 11-04-2006 à 14:22:46  profilanswer
 

eh bien par exemple mon fichier contient des blocs de ce type :

Citation :


          TRUC1  0.80
          TRUC2  1.40
          TRUC3  1.0  
 
          TRUC1  0.90
          TRUC2  1.50
          TRUC3  1.0


 
 
et j'utilise la commande :
 
cat entree.dat | perl -pe 's/TRUC1 ([\d|\.]+)/"TRUC1 ".($1+2)/e' > sortie.txt


Message édité par HokutoNoFred le 11-04-2006 à 14:24:48
n°1344119
HokutoNoFr​ed
Posté le 11-04-2006 à 14:26:33  profilanswer
 

je viens d'essayer en ajoutant des espaces avant "TRUC1" dans la commande (pour être conforme au contenu du fichier), mais cela ne change rien
 
je vais essayer ta commande, avec ton exemple
 
edit : en effet ça marche sur ton exemple...


Message édité par HokutoNoFred le 11-04-2006 à 14:27:56
n°1344121
Elmoricq
Modérateur
Posté le 11-04-2006 à 14:27:06  profilanswer
 

Euh.
 
Autant j'adore PERL, autant une regexp là-dessus, je trouve que c'est de l'overkill :
 

awk '{ if ( $1 == "truc" ) machin=$2+2; printf("%s %s\n",$1,machin); }' fichier_a_traiter

n°1344128
HokutoNoFr​ed
Posté le 11-04-2006 à 14:30:31  profilanswer
 

cette commande awk ressemble à ce dont j'ai besoin, sauf qu'elle ne fait qu'imprimer le parametre et sa nouvelle valeur
 
moi j'ai besoin de conserver tout le reste du fichier original (en fait, remplacer les valeur de parametres, au sein du fichier qui est plein d'autres trucs)

n°1344130
HokutoNoFr​ed
Posté le 11-04-2006 à 14:31:45  profilanswer
 

ah non ça marche
autant pour moi
 
félicitations
 
 
edit : euh je me suis réjouit trop vite
ça marche, dans le sens où ça remplace les valeurs souhaitées
par contre ça coupe plein d'autres trucs dans le fichier...   :cry:

Message cité 1 fois
Message édité par HokutoNoFred le 11-04-2006 à 14:33:42
n°1344132
franceso
Posté le 11-04-2006 à 14:33:16  profilanswer
 

sinon, pour rester en perl sur la base de ce qu'a proposé anapajari :

cat essai.txt | perl -pe 's/TRUC1\s+([\d|\.]+)/"TRUC1 ".($1+2)/e'


la première version marchait pas car dans ton fichier il y a plusieurs espaces pour séparer les colonnes.
 
 
[EDIT] je connais pas tellement awk ; c'est sûrement vrai que perl est un peu overkill

Message cité 1 fois
Message édité par franceso le 11-04-2006 à 14:35:16

---------------
TriScale innov
n°1344133
HokutoNoFr​ed
Posté le 11-04-2006 à 14:34:41  profilanswer
 

franceso a écrit :

la première version marchait pas car dans ton fichier il y a plusieurs espaces pour séparer les colonnes.


 
c'est ce que j'ai vu apres avoir posté mon exemple
 
je m'en vais tester cette version

n°1344134
anapajari
s/travail/glanding on hfr/gs;
Posté le 11-04-2006 à 14:35:45  profilanswer
 

Elmoricq a écrit :

Euh.
 
Autant j'adore PERL, autant une regexp là-dessus, je trouve que c'est de l'overkill :
 

awk '{ if ( $1 == "truc" ) machin=$2+2; printf("%s %s\n",$1,machin); }' fichier_a_traiter



ouais bin oui j'aime pas awk :o

n°1344140
HokutoNoFr​ed
Posté le 11-04-2006 à 14:39:14  profilanswer
 

victoire
 

Citation :

cat essai.txt | perl -pe 's/TRUC1\s+([\d|\.]+)/"TRUC1 ".($1+2)/e'


 
marche en effet nickel
 
d'ailleurs je veux bien qq explications sur la syntaxe de l'instruction, histoire d'apprendre à me débrouiller comme un grand :)
 
que signifie :
-pe ?
+([\d|\.] ?
/e ?

Message cité 1 fois
Message édité par HokutoNoFred le 11-04-2006 à 14:49:58
n°1344148
Elmoricq
Modérateur
Posté le 11-04-2006 à 14:41:29  profilanswer
 

HokutoNoFred a écrit :

par contre ça coupe plein d'autres trucs dans le fichier...   :cry:


 
En même temps, si tu ne nous donnes pas le format en entier...


Message édité par Elmoricq le 11-04-2006 à 14:41:38
n°1344152
HokutoNoFr​ed
Posté le 11-04-2006 à 14:43:40  profilanswer
 

oui pardon, j'avais oublié de préciser qu'il y avait du bordel avant et après...
 
tu crois que c'est tt de même possible avec la commande awk ?
(je réfléchis depuis 2 minutes à un moyen de la modifier, mais je ne vois pas...
en tout cas l'exemple que tu m'en as donné me montre le potentiel de cette commande que je connais, mais ne maitrise pas du tout)


Message édité par HokutoNoFred le 11-04-2006 à 14:44:38
n°1344179
franceso
Posté le 11-04-2006 à 15:01:53  profilanswer
 

HokutoNoFred a écrit :

d'ailleurs je veux bien qq explications sur la syntaxe de l'instruction, histoire d'apprendre à me débrouiller comme un grand :)
 
que signifie :
-pe ?
+([\d|\.] ?
/e ?


options en ligne de commande :

  • -p : boucle sur toutes les lignes et les affiche après traitement
  • -e : permet de passer la commande perl directement sur la ligne de commande (plutôt que d'utiliser un script)


expressions régulières :

  • \s+ matche un ou plusieurs caractères d'espacement (c'est la séparation entre le TRUC1 et le nombre qu'il y a derrière)
  • [\d|\.]+ matche une succession de chiffres et de '.' (c'est le nombre derrière TRUC1)
  • les parenthèses autour de [\d|\.] permettent de se rappeler quelle partie de la ligne a été matchée par cette partie de l'expression régulière ; on s'y réfèrera par la suite grâce à $1
  • le /e à la fin est un modificateur demandant l'évaluation du second membre de l'expression régulière (en gros ça te permet de remplacer "TRUC1 5.0" par "TRUC1 7.0" plutôt que par "TRUC1 5.0+2" )


---------------
TriScale innov
n°1344218
HokutoNoFr​ed
Posté le 11-04-2006 à 15:33:48  profilanswer
 

merci beaucoup pour ces infos détaillées   :jap:  
 
 
sinon je suis en train d'essayer de rajouter un paramètre dans l'instruction, pour pouvoir changer automatiquement au sein d'un script, le nombre à ajouter (ou retrancher) à la valeur initiale du paramètre
 
j'ai donc essayé  
 
 

Citation :

var=$1
(où $1 est le nombre à additionner, saisi qd je lance mon script)
cat entree.dat | perl -pe 's/TRUC\s+([\d|\.]+)/"TRUC ".($1+$var)/e' > sortie.txt


 
mais ça n'a pas eu d'effet sur la valeur initiale du paramètre
 
 
j'ai alors essayé
 

Citation :

var=$1
(où $1 est le nombre saisi qd je lance mon script)
cat entree.dat | perl -pe 's/TRUC\s+([\d|\.]+)/"TRUC ".($1+\$var)/e' > sortie.txt


 
car j'ai lu que le anti-slash "protégeait" l'interprétation de la variable
mais alors là, ça m'a donné une valeur à 8 chiffres pour mon paramètre   :sweat:  
 
je comprend pas tout là...  :(
 
enfin bon tant pis, je vais modifier à la main la valeur dans le script
 
 
En tt cas merci à tous :jap:


Message édité par HokutoNoFred le 11-04-2006 à 15:57:25
n°1349301
skyofdiamo​nds
Posté le 19-04-2006 à 01:25:31  profilanswer
 

désolé, mais  
- la solution du "tr" est plutot minable :
2 processus lourds de lancés
- le grep est inutile a combiner avec le sed
 
plus direct est
sed -e 's/^<//' fichier
(ou sed -e 's/<//g' fichier suivant si on les veut tous remplaer ou seulement le 1er)
 
un seul processus lourd  de lancé  
 
Franchement, je suis déçu , voire consterné
 
le niveau baisse

n°1349304
skyofdiamo​nds
Posté le 19-04-2006 à 02:01:12  profilanswer
 

awk -v a_inc=$inc '/TRUC/ { print $1, a_inc+$2; next } {print $0}' $filename
 
- l option -v permet de passer des parametres au script awk
- j ai rajouté print $0 au cas où ton fichier ne contiendrait pas forcement que des TRUC  
et que tu voudrais les afficher
- next permet de passer à la ligne suivante du fichier afin de ne pas traiter le bloc {print $0}

n°1351575
HokutoNoFr​ed
Posté le 21-04-2006 à 20:23:33  profilanswer
 

ah ok je testerai ça
 
toute info est bonne à prendre, thanks  :jap:

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[AWK | SED] Insert siouxProbleme de programmation unix et stdarg.h
Executer un script shell sur un serveur unix distant a partir de winNTGrep? besoin de la colonne d'une seq recherchee: RESOLU
unix et javascripteeclipse 3.0 et CDT 2.0 et autre ide sous linux/unix.
[BASH] SED et expression régulièrefonctions string et coredump sur UNIX [c'est pas fini]
Methode la plus rapide pour renommer un fichier en C sous UNIXTerminal Unix
Plus de sujets relatifs à : [UNIX] GREP - SED


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)