OVH Cloud OVH Cloud

sed

8 réponses
Avatar
ptilou
Bonjour,

J'ai deux fichiers qui ont un nombre de lignes identiques .
Je souhaite fusioner les lignes de fichier 1 et fichier 2 dans fichier
3
Ex: fichier1 blabla ; fichier 2 toto =3D fichier 3 blablatoto
Comment le faire avec sed la commande g, comment je fais pour qu'il
lise une =E0 une les ligne d'un des deux fichier ?
sed -e "s/\$/???fichier 2/g" fichier 1 > fichier 3 ?
(Est que sed est la bonne commande ? ou il en faut une autre ? )
Merci

Ptilou

8 réponses

Avatar
Marc Boyer
a écrit :
J'ai deux fichiers qui ont un nombre de lignes identiques .
Je souhaite fusioner les lignes de fichier 1 et fichier 2 dans fichier
3
Ex: fichier1 blabla ; fichier 2 toto = fichier 3 blablatoto
Comment le faire avec sed la commande g, comment je fais pour qu'il
lise une à une les ligne d'un des deux fichier ?
sed -e "s/$/???fichier 2/g" fichier 1 > fichier 3 ?
(Est que sed est la bonne commande ? ou il en faut une autre ? )


man paste
man join

Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?

Avatar
Benoit Izac
Bonjour,

le 27/06/2005 à 11:48, a écrit
dans le message :

J'ai deux fichiers qui ont un nombre de lignes identiques .
Je souhaite fusioner les lignes de fichier 1 et fichier 2 dans fichier
3
Ex: fichier1 blabla ; fichier 2 toto = fichier 3 blablatoto
Comment le faire avec sed la commande g, comment je fais pour qu'il
lise une à une les ligne d'un des deux fichier ?
sed -e "s/$/???fichier 2/g" fichier 1 > fichier 3 ?
(Est que sed est la bonne commande ? ou il en faut une autre ? )


Un petit script Perl devrait faire l'affaire :

#!/usr/bin/perl
use warnings;
use strict;

unless (@ARGV == 3) {
print STDERR "usage: $0 file1_in file2_in file_outn";
exit 1;
}

open my $in1, "<", $ARGV[0] or die "can't open $ARGV[0]";
open my $in2, "<", $ARGV[1] or die "can't open $ARGV[1]";
open my $out, ">", $ARGV[2] or die "can't open $ARGV[2]";
{
select $out;
while (defined(my $l_in1 = <$in1>) &&
defined(my $l_in2 = <$in2>)) {
print $l_in1, $l_in2;
}
}
close $in1;
close $in2;
close $out;
__END__

Note que si un fichier comporte plus de lignes que l'autre, les lignes
supplémentaires seront supprimées sans avertissement.

--
Benoit Izac

Avatar
Stephane Chazelas
On Mon, 27 Jun 2005 16:02:52 +0200, Benoit Izac wrote:
[...]
Ex: fichier1 blabla ; fichier 2 toto = fichier 3 blablatoto
Comment le faire avec sed la commande g, comment je fais pour qu'il
lise une à une les ligne d'un des deux fichier ?
sed -e "s/$/???fichier 2/g" fichier 1 > fichier 3 ?
(Est que sed est la bonne commande ? ou il en faut une autre ? )


Un petit script Perl devrait faire l'affaire :
[...]


Quel est le probleme avec paste -d '' a b > c ?

Sinon avec awk:

awk '{getline line < "a"; print a $0}' b > c

--
Stephane


Avatar
Benoit Izac
Bonjour,

le 27/06/2005 à 16:14, Stephane Chazelas a écrit
dans le message :

Ex: fichier1 blabla ; fichier 2 toto = fichier 3 blablatoto Comment
le faire avec sed la commande g, comment je fais pour qu'il lise une
à une les ligne d'un des deux fichier ? sed -e "s/$/???fichier
2/g" fichier 1 > fichier 3 ? (Est que sed est la bonne commande ?
ou il en faut une autre ? )


Un petit script Perl devrait faire l'affaire :
[...]


Quel est le probleme avec paste -d '' a b > c ?


Pas sûr d'avoir bien compris la question mais ce serait pas plutôt :
paste -d 'n' a b > c


Sinon avec awk:

awk '{getline line < "a"; print a $0}' b > c


et ici :
awk '{getline line < "a"; print line "n" $0}' b > c

Sinon pas de problème ;-) À moins que mon serveur de news bouffe des
messages (ce qui est plus que probable), je n'avais pas vu ces
solutions. J'ai donc proposé celle qui me venait à l'esprit et j'avoue
que je ne connaissais pas la commande paste qui me semble parfaite ici.

--
Benoit Izac



Avatar
DoMinix
Bonjour,

le 27/06/2005 à 11:48, a écrit
dans le message :


J'ai deux fichiers qui ont un nombre de lignes identiques .
Je souhaite fusioner les lignes de fichier 1 et fichier 2 dans fichier
3
...



Un petit script Perl devrait faire l'affaire :



toutafé, mais vous pourriez faire plus court

perl -nle 'chomp;push(@{$s[@ARGV]},$_);
END{print $s[1][$_].$s[0][$_] for 0..@{$s[0]}}' fic1 fic2 >fic3


--
dominix


Avatar
Stephane Zuckerman
toutafé, mais vous pourriez faire plus court

perl -nle 'chomp;push(@{$s[@ARGV]},$_);
END{print $s[1][$_].$s[0][$_] for 0..@{$s[0]}}' fic1 fic2 >fic3


... Mais moins lisible. ;-)
--
"Je deteste les ordinateurs : ils font toujours ce que je dis, jamais ce
que je veux !"
"The obvious mathematical breakthrough would be development of an easy
way to factor large prime numbers." (Bill Gates, The Road Ahead)

Avatar
Antoine Leca
En <news:,
Ptilou va escriure:
Je souhaite fusioner les lignes de fichier 1 et fichier 2
dans fichier 3
(Est que sed est la bonne commande ?


Non.
De plus il te faudrait probablement utiliser la commande R, qui est une
extension GNU (plutôt récente), donc ce ne serait pas vraiment portable.
Ou alors fabriquer un script sed à partir de l'un des deux fichiers, ce qui
ne marche que si les fichiers sont de taille « raisonnable ».
Bref du bricolage.


Antoine

Avatar
Laurent Wacrenier
DoMinix écrit:
toutafé, mais vous pourriez faire plus court

perl -nle 'chomp;push(@{$s[@ARGV]},$_);
END{print $s[1][$_].$s[0][$_] for 0..@{$s[0]}}' fic1 fic2 >fic3


On peut toujours faire plus court...

perl -lne 'chomp($a[$i++].=$_);$i=0if eof;END{$,=$/;print @a}' fic1 fic2