shell - lire 2 fichiers en parallèle ?
Salut, Question posée par un collègue, qui pour moi n'est pas solvable en shell : peut-on lire 2 fichiers en parallèle ? l'idée, c'est qu'il veut faire une sorte de diff ligne à ligne avec une sortie formatée bizarrement, mais bon, il veut comparer ligne à ligne 2 fichiers. J'imagine assez bien des solutions pas trop jolies, genre récupérer le nombre de lignes, et passer du head et du tail dans une boucle pour récupérer dans des variables les lignes en question, mais je ne voies pas de solutions "propres" ... Une idée ? Merci, Jérémy
Salut, 2011/5/5 Jeremy Monnet <jmonnet@gmail.com>:
Salut,
Question posée par un collègue, qui pour moi n'est pas solvable en shell : peut-on lire 2 fichiers en parallèle ? l'idée, c'est qu'il veut faire une sorte de diff ligne à ligne avec une sortie formatée bizarrement, mais bon, il veut comparer ligne à ligne 2 fichiers.
J'imagine assez bien des solutions pas trop jolies, genre récupérer le nombre de lignes, et passer du head et du tail dans une boucle pour récupérer dans des variables les lignes en question, mais je ne voies pas de solutions "propres" ...
Une idée ? Comme souvent, après avoir posé, on trouve une réponse : exec 3<toto exec 4<toto.bak while IFS= read -r un <&3; read -r deux <&4; do echo "1 : $un, 2: $deux"; done 1 : patate, 2: patate 1 : tata, 2: tata 1 : titi, 2: titi 1 : tutu, 2: tutu
Librement, Jérémy
Bonjour, Le 5 mai 2011 à 17:33, Jeremy Monnet a écrit :
Comme souvent, après avoir posé, on trouve une réponse : exec 3<toto exec 4<toto.bak while IFS= read -r un <&3; read -r deux <&4; do echo "1 : $un, 2: $deux"; done 1 : patate, 2: patate 1 : tata, 2: tata 1 : titi, 2: titi 1 : tutu, 2: tutu
Pas mal du tout. Très bien vu même ! Si un fichier est plus long que l'autre et qu'on veut aller au bout du second, il faut modifier un peu. voilà mon idée : exec 3<toto1 4<toto2 ; stop1= stop2= while read -r un <&3 || { un=PLUSRIEN ; stop1=1; } read -r deux <&4 || { deux=PLUSRIEN ; stop2=1; } test ! '(' "$stop1" -a "$stop2" ')' do echo "1 : $un, 2: $deux" done exec 3>&- 4>&- 1 : 1, 2: un 1 : 2, 2: deux 1 : 3, 2: trois 1 : 4, 2: quatre 1 : 5, 2: PLUSRIEN 1 : 6, 2: PLUSRIEN 1 : 7, 2: PLUSRIEN bonsoir
On Thu, May 05, 2011 at 05:23:15PM +0200, Jeremy Monnet wrote:
Salut,
Question posée par un collègue, qui pour moi n'est pas solvable en shell : peut-on lire 2 fichiers en parallèle ?
en zsh (je veux meme pas me rappeller des autres shells): exec {data}< foo.txt exec {data2}< bar.txt # $data et $data2 contiennent des fileno while {read -u $data foo } { read -u $data2 bar print "$foo|$bar" } mais le principe est dans les shells posix: - exec avec des redirections te permet de faire des open et close (mais dans les vieux shells tu te tappes le fileno a la main :)) - une fois ouverts, les filenos sont utilisables par toutes les redirections (comme 0, 1 et 2) donc en sh tu vas écrire un truc du genre exec 3< foo.txt # ouverture en lecture exec 4> bar.txt # ouverture en écriture read line <&3 # lire une ligne de foo.txt pwd >&4 # écrire le repertoire courant bar.txt exec 3>&- # clore les fichiers exec 4>&- maintenant: c'est pas parceque tu peux que tu dois! verifie bien qu'aucun filtre standard (join, paste, ...) ne colle a ton pb! marc
participants (3)
-
Christophe Martin
-
Jeremy Monnet
-
Marc Chantreux