générer une séquence

Le
Mihamina Rakotomandimby (R12y)
Bonjour,
Soit un fichier (data.txt) de 17 lignes dont chaque ligne de contient
que des caractères numériques et ce script:

#!/bin/bash
N=`wc -l data.txt | awk '{print $1}'`
for I in {1..$N};
do
NUMB=`sed -n "${I}p" data.txt`
echo $I "->" $NUMB
done

Le but est d'afficher:
<N° de ligne> "->" <contenu de la ligne>

Le problème est que cette manière de générer la séquence ne fonctionne
pas. Voici son output:
mihamina@phenom:~$ ./test.sh
sed: -e expression #1, char 3: unknown command: `.'
{1..17} ->
Ce qui veut dire qu'il a mis la chaine "{1..17}" dans "I".

Par contre, ça fonctionne bien avec "seq":

#!/bin/bash
N=`wc -l data.txt | awk '{print $1}'`
for I in `seq 1 $N`;
do
NUMB=`sed -n "${I}p" data.txt`
echo $I "->" $NUMB
done

En réalité je dois faire du plus complexe, mais c'est la partie de mon
problème ou je bloque.
Je préfère utiliser la notation {X..Y}, auriez-vous la petite chose qui
fait que "ça fonctionne"?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Marc
Le #16532521
R12y wrote:

#!/bin/bash
N=`wc -l data.txt | awk '{print $1}'`
for I in {1..$N};


^^^^^^^
do
NUMB=`sed -n "${I}p" data.txt`
echo $I "->" $NUMB
done



Tiens, c'est amusant que bash refuse la syntaxe {X..Y} quand X ou Y n'est
pas une constante. ksh93 et zsh font tous les deux ce à quoi on s'attend.
Stephane CHAZELAS
Le #16532511
2008-08-12, 18:42(+03), Mihamina Rakotomandimby (R12y):
[...]
Soit un fichier (data.txt) de 17 lignes dont chaque ligne de contient
que des caractères numériques et ce script:

#!/bin/bash
N=`wc -l data.txt | awk '{print $1}'`
for I in {1..$N};
do
NUMB=`sed -n "${I}p" data.txt`
echo $I "->" $NUMB
done



erk!

Le but est d'afficher:
<N° de ligne> "->" <contenu de la ligne>



Une bonne regle: ne pas utiliser de boucle shell si possible.

awk '
{print NR " -> " $0}' < data.txt


Une autre bonne regle: ecrire des scripts POSIX plutot que pour
telle ou telle version de tel ou tel interpreteur.

--
Stéphane
Jacques L'helgoualc'h
Le #16532631
Le 12-08-2008, Mihamina Rakotomandimby (R12y)
Bonjour,



bonjour,

Soit un fichier (data.txt) de 17 lignes dont chaque ligne de contient
que des caractères numériques et ce script:


[...]
Le but est d'afficher:
<N° de ligne> "->" <contenu de la ligne>



En deux passes avec GNU Sed :

sed -e '=' data.txt | sed -e '1~2{N;s/n/ -> /}'

ou une seule avec Awk :

awk '{print NR" -> "$0}' data.txt


Pour utiliser {1..$N}, tu peux passer par :

eval "echo {1..$N}"

et éviter le pipe

wc -l fichier | awk '{print $1}'

avec

wc -l <fichier

--
Jacques L'helgoualc'h
Mihamina Rakotomandimby (R12y)
Le #16533191
Stephane CHAZELAS wrote:
2008-08-12, 18:42(+03), Mihamina Rakotomandimby (R12y):
[...]
Soit un fichier (data.txt) de 17 lignes dont chaque ligne de contient
que des caractères numériques et ce script:

#!/bin/bash
N=`wc -l data.txt | awk '{print $1}'`
for I in {1..$N};
do
NUMB=`sed -n "${I}p" data.txt`
echo $I "->" $NUMB
done


erk!



J'ai _beaucoup_ d'instructions dans le corps de la boucle.
J'ai juste donné cet exemple parcequ'il permet de reproduire mon problème.

Le but est d'afficher:
<N° de ligne> "->" <contenu de la ligne>


Une bonne regle: ne pas utiliser de boucle shell si possible.
awk '
{print NR " -> " $0}' < data.txt



Oui mais j'ai besoin d'un "corps de boucle".

Une autre bonne regle: ecrire des scripts POSIX plutot que pour
telle ou telle version de tel ou tel interpreteur.



Je n'ai pas eu l'intention de faire un script spécial pour tel ou tel
interpréteur. Je veux générer un séquence avec {, .. et }. Ta réponse me
laisse supposer {} n'est pas POSIX... est-ce que c'est "seq" qui l'est?
Stephane CHAZELAS
Le #16540251
2008-08-12, 20:02(+03), Mihamina Rakotomandimby (R12y):
[...]
awk '
{print NR " -> " $0}' < data.txt



Oui mais j'ai besoin d'un "corps de boucle".



awk fournit un corps de boucle qui lit un fichier ligne par
ligne, tout comme la plupart des outils qui lisent du texte.


Une autre bonne regle: ecrire des scripts POSIX plutot que pour
telle ou telle version de tel ou tel interpreteur.



Je n'ai pas eu l'intention de faire un script spécial pour tel ou tel
interpréteur. Je veux générer un séquence avec {, .. et }. Ta réponse me
laisse supposer {} n'est pas POSIX... est-ce que c'est "seq" qui l'est?



Non, ni l'un ni l'autre ne sont standard.

Si vraiment, et ca m'etonnerait, tu as absolument besoin
d'ecrire une boucle shell, alors fait-le au moins dans le style:

n=0
while IFS= read -r line <&3; do
n=$(($n + 1))
...
done 3< file.txt

(ne marche qu'avec les fichiers texte).

--
Stéphane
dominix
Le #16544231
Mihamina Rakotomandimby (R12y) a écrit :
Bonjour,
Soit un fichier (data.txt) de 17 lignes dont chaque ligne de contient
que des caractères numériques et ce script:

#!/bin/bash
N=`wc -l data.txt | awk '{print $1}'`
for I in {1..$N};
do
NUMB=`sed -n "${I}p" data.txt`
echo $I "->" $NUMB
done

Le but est d'afficher:
<N° de ligne> "->" <contenu de la ligne>


...

perl -pe '$_ = "$. -> $_"' fichier

et la tu fait ça que tu veux avec $_

--
Dominix
Publicité
Poster une réponse
Anonyme