Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

générer une séquence

6 réponses
Avatar
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"?

6 réponses

Avatar
Marc
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.
Avatar
Stephane CHAZELAS
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
Avatar
Jacques L'helgoualc'h
Le 12-08-2008, Mihamina Rakotomandimby (R12y) a écrit :
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
Avatar
Mihamina Rakotomandimby (R12y)
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?
Avatar
Stephane CHAZELAS
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
Avatar
dominix
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