Shell: parcourir fichier sans boucle while

Fermé
boug - 27 nov. 2010 à 01:18
 boug - 27 nov. 2010 à 14:50
Bonjour,
Désolé de vous déranger, mais je suis un petit peu perdu.
J'ai réalisé un script qui lit un fichier de nombre (un nombre par ligne) et qui trace la courbe associée aux valeurs du fichier.

Le parcours de ce fichier se fait avec une boucle while évidemment. Seulement pour les fichiers très longs (milliers de lignes), le temps de traitement n'est plus du tout raisonnable et on me demande de penser à une composition de commande Unix qui réglerait ça.
Je trouve pas du tout.

Merci d'avance.

A voir également:

3 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
27 nov. 2010 à 10:16
Salut,

Voici quelque exemples de lecture sans while, mais peut être qu'il sera mieux de donner plus de précisions.
Comment tu veux utiliser les données récupéré par exemple?
~$ cat fichier.txt 
1
2
3
4
5
6
7
8
9
10
~$ for ligne in $(cat fichier.txt);do echo je fais quelque chose avec $ligne;done
je fais quelque chose avec 1
je fais quelque chose avec 2
je fais quelque chose avec 3
je fais quelque chose avec 4
je fais quelque chose avec 5
je fais quelque chose avec 6
je fais quelque chose avec 7
je fais quelque chose avec 8
je fais quelque chose avec 9
je fais quelque chose avec 10
~$ awk '{ print "je fais quelque chose avec " $0}' fichier.txt
je fais quelque chose avec 1
je fais quelque chose avec 2
je fais quelque chose avec 3
je fais quelque chose avec 4
je fais quelque chose avec 5
je fais quelque chose avec 6
je fais quelque chose avec 7
je fais quelque chose avec 8
je fais quelque chose avec 9
je fais quelque chose avec 10
~$ sed 's/.*/je fais quelque chose avec &/' fichier.txt
je fais quelque chose avec 1
je fais quelque chose avec 2
je fais quelque chose avec 3
je fais quelque chose avec 4
je fais quelque chose avec 5
je fais quelque chose avec 6
je fais quelque chose avec 7
je fais quelque chose avec 8
je fais quelque chose avec 9
je fais quelque chose avec 10

1
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 409
27 nov. 2010 à 11:07
Salut,

Tiens un petit test à titre de comparaison sur une boucle "for" et une boucle "while" pour l'écriture d'un fichier d'1 million de lignes.

Machine de test : PIV à 1,5 Ghz avec 1 Go de ram

$ time ./while_commande.sh
92.92user 33.94system 5:00.18elapsed 42%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+877minor)pagefaults 0swaps

$ time ./for_commande.sh
66.89user 25.45system 3:34.78elapsed 42%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+27932minor)pagefaults 0swaps

0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
27 nov. 2010 à 11:11
Salut,

Peut être que le traitement est ralenti chez puisque la boucle while fait plus que récupérer les données dans le fichier ou que le ralenti c'est dans une autre parti de script.

Voir le script ça sera mieux je pense.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 409
27 nov. 2010 à 11:14
Salut,

Oui c'est sûr que le traitement en lui même doit influencer pas mal, mais déjà sur un traitement similaire, on constate que la boucle "for" est moins gourmande en temps général. Les temps "user" et "système" le sont également ;-)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 409
27 nov. 2010 à 11:18
J'ai réduis le nombre de ligne à 100000 :

$ time -p ./for_commande.sh
real 10.07
user 6.61
sys 1.52

$ time -p ./while_commande.sh
real 15.35
user 8.34
sys 2.55
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
27 nov. 2010 à 11:18
Re,

Oui, j'a vu ça ;-), mais pour un million de ligne ce n'est pas vraiment énorme encore moins pour milliers.
Vu qu'il cherche un temps plus raisonnable je pense à un écart plus grand ;-)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 409
27 nov. 2010 à 11:20
Après reste à savoir si c'est possible ;-\
0
Merci à tous pour vos réponses, j'ai finalement composé avec une boucle while et le temps de traitement n'est pas trop trop long, dans les 4 minutes pour les grosses images. Je vous donne des précisions:

mon objectif est de creer un script qui prend en argument une image jpg, qui lit les pixels et qui finalement me donne le nombre d'itérations de chaque niveau de couleurs (rouge vert bleu), par exemple:
rouge :
21 65 (65 itérations du pixel niveau de rouge 21)
34 12
145 56
...
vert:
45 3
123 4
...
etc

le fait est que pour image de quelques millions de pixels, c'est beaucoup moins rigolo au niveau du temps d'attente, car j'effectue le parcours des pixels avec une boucle while.
On m'a dit (le "on" c'est le professeur d'info qui nous a demandé ce travail) qu'avec "une composition de commande UNIX adéquate" on traitait les gros fichier beaucoup plus rapidement qu'avec un while.


Je me suis quand même contenté du while, mais j'aurai voulu avoir cette fameuse composition de commande adéquate.

NB: une image jpg peut être affichée en texte et cela donne un truc du genre:

123 23 45 12 45 67 54 87 98 124 254 9 56 67 78 200 100 5
.
.
.
.

ce sont des triplets rouge vert bleu.
0