Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[sed] Utililisation dans une boucle (résolu)
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
Neuromancien
l33t
l33t


Joined: 03 Dec 2003
Posts: 867

PostPosted: Wed Jul 16, 2008 3:33 pm    Post subject: [sed] Utililisation dans une boucle (résolu) Reply with quote

Bonjour,

J'ai la commande suivante qui permet de récupérer la valeur d'une ligne/colonne dans un fichier :
Code:
sed -n '2p' test | cut -d";" -f2

J'aimerais utiliser cette commande dans une boucle afin de parcourir les colonnes d'un fichier, et pour chaque colonne, récupérer les valeurs de certaines lignes pour les comparer. Est-ce possible et si oui comment ?

D'autre part j'aimerais compter le nombre d'occurrences d'une lettre sur une ligne donnée.
_________________
emerge --info
dmesg
lspci
.config


Last edited by Neuromancien on Fri Jul 18, 2008 1:25 pm; edited 1 time in total
Back to top
View user's profile Send private message
Bapt
Veteran
Veteran


Joined: 14 Apr 2003
Posts: 1152
Location: Paris

PostPosted: Wed Jul 16, 2008 3:46 pm    Post subject: Reply with quote

tout est là : http://fr.wikibooks.org/wiki/Cat%C3%A9gorie:Shell
Back to top
View user's profile Send private message
Neuromancien
l33t
l33t


Joined: 03 Dec 2003
Posts: 867

PostPosted: Wed Jul 16, 2008 3:53 pm    Post subject: Reply with quote

Pour le premier point, je viens de voir que la syntaxe suivante fonctionne :
Code:
sed -n "$COL"p INS20060421.DAT | cut -d";" -f2

Je continue à chercher pour le deuxième point. Merci pour le lien.
_________________
emerge --info
dmesg
lspci
.config
Back to top
View user's profile Send private message
truc
Advocate
Advocate


Joined: 25 Jul 2005
Posts: 3199

PostPosted: Wed Jul 16, 2008 6:44 pm    Post subject: Reply with quote

Si tu veux compter, ou des faire des trucs un peu élaboré, je te conseille fortement de t'orienter plutôt vers awk ou Perl. Mais dans tous les cas, montre nous ce que tu as, et ce que tu veux, si tu veux qu'on puisse t'aider plus facielement qu'en brassant de l'air :)
_________________
The End of the Internet!
Back to top
View user's profile Send private message
Neuromancien
l33t
l33t


Joined: 03 Dec 2003
Posts: 867

PostPosted: Thu Jul 17, 2008 10:08 am    Post subject: Reply with quote

Bapt wrote:
tout est là : http://fr.wikibooks.org/wiki/Cat%C3%A9gorie:Shell

LOL. Il n'y a strictement rien sur sed...

truc wrote:
Si tu veux compter, ou des faire des trucs un peu élaboré, je te conseille fortement de t'orienter plutôt vers awk ou Perl. Mais dans tous les cas, montre nous ce que tu as, et ce que tu veux, si tu veux qu'on puisse t'aider plus facielement qu'en brassant de l'air :)

1) J'aimerais parcourir les colonnes, et comparer les valeurs de certaines lignes, par exemples pour vérifier que si la ligne 2 contient une valeur la ligne 3 n'est pas vide. Je pense pouvoir le faire avec sed, mais il existe peut-être un moyen plus simple avec awk.
2) Je voudrais compter le nombre d'occurrences d'un caractère sur une ligne.
_________________
emerge --info
dmesg
lspci
.config
Back to top
View user's profile Send private message
truc
Advocate
Advocate


Joined: 25 Jul 2005
Posts: 3199

PostPosted: Thu Jul 17, 2008 1:39 pm    Post subject: Reply with quote

Je la refais donc, te ne veux pas compter avec sed, j't'assure te ne veux pas, et si te veux t'en convaincre, cherche le script calculatrice écrit en sed.

Ensuite, si tu veux comparer des lignes, alors là c'est pire, tu ne compares pas avec sed, tu n'as que le hold buffer pour te faire office de variable, et la seule chose que tu peux en faire reste encore très limité, faire des substitutions, concatener avec le pattern space, et c'est quasiment tout.

Et si tu veux travailler sur des champs, alors utilises awk ou perl sans hésiter. Tu peux assez laborieusement trouver les éléments de telle ou telle colonne avec sed (laborieusement comparé à awk ou perl), mais si tu veux en faire autre chose que de la place différemment dans ta chaine de replacement alors encore une fois il faut oublier sed.

J'ai l'impression que tu ne vois pas ce que je veux dire, mais alors essaies!

Attention à ce que je n'ai pas dit: je suis un gros gros fan de sed (rien qu'à voir quelques uns de mes derniers posts...) , pour dire, tous mes collègues le savent... (et j'assume, car par dessus tout, j'adore ed),. Ceci dit comme tout language, il est plus adapté à faire certaines choses que d'autres...

voili voilou
_________________
The End of the Internet!
Back to top
View user's profile Send private message
Neuromancien
l33t
l33t


Joined: 03 Dec 2003
Posts: 867

PostPosted: Thu Jul 17, 2008 2:08 pm    Post subject: Reply with quote

truc wrote:
Et si tu veux travailler sur des champs, alors utilises awk ou perl sans hésiter. Tu peux assez laborieusement trouver les éléments de telle ou telle colonne avec sed (laborieusement comparé à awk ou perl), mais si tu veux en faire autre chose que de la place différemment dans ta chaine de replacement alors encore une fois il faut oublier sed.

J'ai l'impression que tu ne vois pas ce que je veux dire, mais alors essaies!

Ca fonctionne très bien en quelques lignes avec une boucle, des conditions et sed, et ça a l'avantage d'être plus clair que du awk. Il me reste à trouver une solution pour compter le nombre d'occurrences d'une lettre sur une ligne, ce qui devrait être possible avec sed...
_________________
emerge --info
dmesg
lspci
.config
Back to top
View user's profile Send private message
truc
Advocate
Advocate


Joined: 25 Jul 2005
Posts: 3199

PostPosted: Thu Jul 17, 2008 3:20 pm    Post subject: Reply with quote

Neuromancien wrote:
Ca fonctionne très bien en quelques lignes avec une boucle, des conditions et sed, et ça a l'avantage d'être plus clair que du awk.

Pourrait-on voir une ligne que tu découpes, ainsi que ta ligne sed pour le faire?

Quote:
Il me reste à trouver une solution pour compter le nombre d'occurrences d'une lettre sur une ligne, ce qui devrait être possible avec sed...
vas-y vas-y et montre nous tous ça après :)
_________________
The End of the Internet!
Back to top
View user's profile Send private message
Neuromancien
l33t
l33t


Joined: 03 Dec 2003
Posts: 867

PostPosted: Thu Jul 17, 2008 5:06 pm    Post subject: Reply with quote

truc wrote:
Neuromancien wrote:
Ca fonctionne très bien en quelques lignes avec une boucle, des conditions et sed, et ça a l'avantage d'être plus clair que du awk.

Pourrait-on voir une ligne que tu découpes, ainsi que ta ligne sed pour le faire?

Code:
i=1
while [ $i -le $COLS ]
export VAL_LIGNE_4=`sed -n '4p' $2 | cut -d";" -f"$i"`
if [ "$VAL_LIGNE_4" == "Test" ]; then
[Traitement]
fi
i=$(($i+1))
done

truc wrote:
Quote:
Il me reste à trouver une solution pour compter le nombre d'occurrences d'une lettre sur une ligne, ce qui devrait être possible avec sed...
vas-y vas-y et montre nous tous ça après :)

Non, je n'arrive pas à le faire, ni avec sed, ni avec awk. Qui peut m'aider ?
_________________
emerge --info
dmesg
lspci
.config
Back to top
View user's profile Send private message
XavierMiller
Moderator
Moderator


Joined: 23 Jul 2004
Posts: 5531
Location: ~Brussels - Belgique

PostPosted: Thu Jul 17, 2008 5:27 pm    Post subject: Reply with quote

je pense qu'il n'y a pas moyen. Comment pourrais-tu compter rien qu'avec des expressions régulières :?:
_________________
Xavier Miller
(FR) Merci de respecter les règles du forum.
http://www.xaviermiller.be
Back to top
View user's profile Send private message
truc
Advocate
Advocate


Joined: 25 Jul 2005
Posts: 3199

PostPosted: Thu Jul 17, 2008 5:57 pm    Post subject: Reply with quote

XavierMiller wrote:
je pense qu'il n'y a pas moyen. Comment pourrais-tu compter rien qu'avec des expressions régulières :?:


Nan mais je lui ai déjà dit par 3fois, expliqué par deux fois, mais il ne veut rien entendre.. j'attends donc qu'il nous montre.

Code:
export VAL_LIGNE_4=`sed -n '4p' $2 | cut -d";" -f"$i"`
Sinon, ok, c'est vachement du sed ça, c'est un sed puis un cut, c'est très différent, tu ne t'es donc pas galérer à récuperer le champ $i avec sed.

En plus vu que ton $2 ne change pas, ça veut dire qu'a chaque itération, ton sed parcourt tout le fichier (à chaque fois), tu pourrais au moins quitter après la quatrième ligne, pour éviter ça ( sed -n '4{p;q}' ).

changes-tu le fichier $2, pendant ton [Traitement], sinon, alors il y a encore plus simple pour iterer sur tous les champs de la ligne 4. Et pourrait-ôn savoir ce que tu y fais plus précisément? Il est possible qu'on puisse simplifier encore plus tout ça.
_________________
The End of the Internet!
Back to top
View user's profile Send private message
Neuromancien
l33t
l33t


Joined: 03 Dec 2003
Posts: 867

PostPosted: Fri Jul 18, 2008 1:23 pm    Post subject: Reply with quote

XavierMiller wrote:
je pense qu'il n'y a pas moyen. Comment pourrais-tu compter rien qu'avec des expressions régulières :?:

Cala fonctionne avec :
Code:
echo $ligne |sed -e "s/[^z]//g" |wc -c


truc wrote:
Code:
export VAL_LIGNE_4=`sed -n '4p' $2 | cut -d";" -f"$i"`
Sinon, ok, c'est vachement du sed ça, c'est un sed puis un cut, c'est très différent, tu ne t'es donc pas galérer à récuperer le champ $i avec sed.

Je n'ai jamais dit que je voulais faire ça.

truc wrote:
En plus vu que ton $2 ne change pas, ça veut dire qu'a chaque itération, ton sed parcourt tout le fichier (à chaque fois), tu pourrais au moins quitter après la quatrième ligne, pour éviter ça ( sed -n '4{p;q}' ).

Visiblement cette syntaxe n'est pas acceptée sous AIX.

truc wrote:
Il est possible qu'on puisse simplifier encore plus tout ça.

Je suppose qu'on peut faire plus simple et plus élégant, peut-être avec awk.
_________________
emerge --info
dmesg
lspci
.config
Back to top
View user's profile Send private message
XavierMiller
Moderator
Moderator


Joined: 23 Jul 2004
Posts: 5531
Location: ~Brussels - Belgique

PostPosted: Fri Jul 18, 2008 2:07 pm    Post subject: Reply with quote

Neuromancien wrote:
XavierMiller wrote:
je pense qu'il n'y a pas moyen. Comment pourrais-tu compter rien qu'avec des expressions régulières :?:

Cala fonctionne avec :
Code:
echo $ligne |sed -e "s/[^z]//g" |wc -c


Tu as triché : tu utilises wc et pas uniquement sed :!:
_________________
Xavier Miller
(FR) Merci de respecter les règles du forum.
http://www.xaviermiller.be
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum