# [sed] Utililisation dans une boucle (résolu)

## Neuromancien

Bonjour,

J'ai la commande suivante qui permet de récupérer la valeur d'une ligne/colonne dans un fichier :

```
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.

----------

## Bapt

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

----------

## Neuromancien

Pour le premier point, je viens de voir que la syntaxe suivante fonctionne :

```
sed -n "$COL"p INS20060421.DAT | cut -d";" -f2
```

Je continue à chercher pour le deuxième point. Merci pour le lien.

----------

## truc

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  :Smile: 

----------

## Neuromancien

 *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.

----------

## truc

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

----------

## Neuromancien

 *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...

----------

## truc

 *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  :Smile: 

----------

## Neuromancien

 *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?

 

```
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 ?

----------

## xaviermiller

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

----------

## truc

 *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.

```
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.

----------

## Neuromancien

 *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 : 

```
echo $ligne |sed -e "s/[^z]//g" |wc -c
```

 *truc wrote:*   

> 
> 
> ```
> export VAL_LIGNE_4=`sed -n '4p' $2 | cut -d";" -f"$i"` 
> ```
> ...

 

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.

----------

## xaviermiller

 *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 : 
> 
> ```
> ...

 

Tu as triché : tu utilises wc et pas uniquement sed  :Exclamation: 

----------

