OVH Cloud OVH Cloud

Boucle de lecture de 2 fichiers

7 réponses
Avatar
Tittom
Bonjour,

Voici un petit probl=E8me de shell.
Je souhaite lire deux fichiers s=E9quentiellement, simultan=E9ment dans
la m=EAme boucle.
En fran=E7ais dans le code :

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D
ligne1=3DLire fichier 1
ligne2=3DLire fichier 2

D=E9but de boucle

J'exploite ligne1 et ligne2 et je met le r=E9sultat dans un fichier 3

Si j'ai eu besoin de ligne1
je relis une nouvelle ligne du fichier 1 donc ligne1=3DLire fichier 1
Fin de si

Si j'ai eu besoin de ligne2
je relis une nouvelle ligne du fichier 2 donc ligne2=3DLire fichier 2
Fin de Si

Si Fichier 1 fini ET Fichier 2 fini
Je sors de ma boucle
Fin de SI

Fin de boucle
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D

J'ai essay=E9 la m=E9thode
read -u 3 ligne1
read -u 4 ligne2

Mais je risque d'avoir des probl=E8mes si je fais tourner mon shell en
parall=E8le pour traiter 2 fichiers diff=E9rents, non ?
Donc quelle m=E9thode employer plut=F4t que des File Descriptor ?

Merci pour votre aide :)
--
Tittom

7 réponses

Avatar
Stephane Chazelas
2005-10-29, 01:43(-07), Tittom:
Bonjour,

Voici un petit problème de shell.
Je souhaite lire deux fichiers séquentiellement, simultanément dans
la même boucle.
[...]


while :; do
IFS= read <&3 -r l1 || break
IFS= read <&4 -r l2 || break

...
done 3< file1 4< file2

Mais c'est en general une mauvaise idee de faire des boucles en
shell, surtout pour processer du texte. Utilise awk.

awk '
{
l1 = $0
if ((getline l2 < "file2") <= 0) exit

...
}' < file1

--
Stéphane

Avatar
Tittom

[...]
c'est en general une mauvaise idee de faire des boucles en
shell, surtout pour processer du texte. Utilise awk.

awk '
{
l1 = $0
if ((getline l2 < "file2") <= 0) exit

...
}' < file1
[...]


Je le note !
Dans ton exemple ci-dessus, ne vais-je pas relire tout file2 à chaque
nouvelle ligne lue de file1 ?
Mes fichiers sont gros, alors cela serait très pénalisant en termes
de perfs, à mon avis.

--
Tittom

Avatar
Laurent Wacrenier
Tittom écrit:
Voici un petit problème de shell.
Je souhaite lire deux fichiers séquentiellement, simultanément dans
la même boucle.
En français dans le code :


Ca ne serait pas pour faire un tri, par hazard ?

Avatar
Pascal Bourguignon
"Tittom" writes:
J'ai essayé la méthode
read -u 3 ligne1
read -u 4 ligne2

Mais je risque d'avoir des problèmes si je fais tourner mon shell en
parallèle pour traiter 2 fichiers différents, non ?
Donc quelle méthode employer plutôt que des File Descriptor ?


Non, car les file descriptors sont propres au processus.

Sur linux vois:

ls -l /proc/[0-9]*/fd/


--
__Pascal Bourguignon__ http://www.informatimago.com/
In deep sleep hear sound,
Cat vomit hairball somewhere.
Will find in morning.

Avatar
Stephane Chazelas
2005-10-29, 02:05(-07), Tittom:


[...]
c'est en general une mauvaise idee de faire des boucles en
shell, surtout pour processer du texte. Utilise awk.

awk '
{
l1 = $0
if ((getline l2 < "file2") <= 0) exit

...
}' < file1
[...]


Je le note !
Dans ton exemple ci-dessus, ne vais-je pas relire tout file2 à chaque
nouvelle ligne lue de file1 ?
[...]


Non, c'est la facon d'ouvrir et de lire les fichiers en awk. Le
premier getline ouvre le fichier et lit la premiere ligne, les
suivants appelés avec le meme chemin de fichier lisent les
lignes suivantes. Il faut un close() pour fermer le fichier.

Mes fichiers sont gros, alors cela serait très pénalisant en termes
de perfs, à mon avis.
[...]


Ce qui serait penalisant, ca serait de le faire avec un shell
qui appelerait plusieurs utilities par ligne de fichier.

--
Stéphane


Avatar
Tittom
Stephane Chazelas wrote:
Non, c'est la facon d'ouvrir et de lire les fichiers en awk. Le
premier getline ouvre le fichier et lit la premiere ligne, les
suivants appelés avec le meme chemin de fichier lisent les
lignes suivantes. Il faut un close() pour fermer le fichier.


Ok vu, j'ai fait quelques tests :)

Mes fichiers sont gros, alors cela serait très pénalisant en termes
de perfs, à mon avis.
[...]


Ce qui serait penalisant, ca serait de le faire avec un shell
qui appelerait plusieurs utilities par ligne de fichier.


En effet, et au vu des tests awk que j'ai fait, awk fairait pleinement
mon affaire.

Merci, beaucoup.


Avatar
Tittom
Laurent Wacrenier wrote:
Tittom écrit:
Voici un petit problème de shell.
Je souhaite lire deux fichiers séquentiellement, simultanément dans
la même boucle.
En français dans le code :


Ca ne serait pas pour faire un tri, par hazard ?


Non.
C'est pour réaliser des comparaisons sur des fichiers déjà triés,
avec un rapport détaillé des écarts champs par champs, que je
n'arrive pas à obtenir avec diff ni comm.