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