View previous topic :: View next topic |
Author |
Message |
Neuromancien l33t
Joined: 03 Dec 2003 Posts: 867
|
Posted: Wed Jul 16, 2008 3:33 pm Post subject: [sed] Utililisation dans une boucle (résolu) |
|
|
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 |
|
|
Bapt Veteran
Joined: 14 Apr 2003 Posts: 1152 Location: Paris
|
|
Back to top |
|
|
Neuromancien l33t
Joined: 03 Dec 2003 Posts: 867
|
Posted: Wed Jul 16, 2008 3:53 pm Post subject: |
|
|
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 |
|
|
truc Advocate
Joined: 25 Jul 2005 Posts: 3199
|
Posted: Wed Jul 16, 2008 6:44 pm Post subject: |
|
|
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 |
|
|
Neuromancien l33t
Joined: 03 Dec 2003 Posts: 867
|
Posted: Thu Jul 17, 2008 10:08 am Post subject: |
|
|
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 |
|
|
truc Advocate
Joined: 25 Jul 2005 Posts: 3199
|
Posted: Thu Jul 17, 2008 1:39 pm Post subject: |
|
|
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 |
|
|
Neuromancien l33t
Joined: 03 Dec 2003 Posts: 867
|
Posted: Thu Jul 17, 2008 2:08 pm Post subject: |
|
|
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 |
|
|
truc Advocate
Joined: 25 Jul 2005 Posts: 3199
|
Posted: Thu Jul 17, 2008 3:20 pm Post subject: |
|
|
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 |
|
|
Neuromancien l33t
Joined: 03 Dec 2003 Posts: 867
|
Posted: Thu Jul 17, 2008 5:06 pm Post subject: |
|
|
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 |
|
|
xaviermiller Bodhisattva
Joined: 23 Jul 2004 Posts: 8708 Location: ~Brussels - Belgique
|
Posted: Thu Jul 17, 2008 5:27 pm Post subject: |
|
|
je pense qu'il n'y a pas moyen. Comment pourrais-tu compter rien qu'avec des expressions régulières _________________ Kind regards,
Xavier Miller |
|
Back to top |
|
|
truc Advocate
Joined: 25 Jul 2005 Posts: 3199
|
Posted: Thu Jul 17, 2008 5:57 pm Post subject: |
|
|
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 |
|
|
Neuromancien l33t
Joined: 03 Dec 2003 Posts: 867
|
Posted: Fri Jul 18, 2008 1:23 pm Post subject: |
|
|
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 |
|
|
xaviermiller Bodhisattva
Joined: 23 Jul 2004 Posts: 8708 Location: ~Brussels - Belgique
|
Posted: Fri Jul 18, 2008 2:07 pm Post subject: |
|
|
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 _________________ Kind regards,
Xavier Miller |
|
Back to top |
|
|
|
|
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
|
|