cat file1
foo
ice
two
cat file2
bar
cream
hundred
Sortie désirée:
foobar
icecream
twohundred
file1 et file2 auront toujours le même nombre de lignes dans mon scénario, au cas où cela rendrait les choses plus faciles.
cat file1
foo
ice
two
cat file2
bar
cream
hundred
Sortie désirée:
foobar
icecream
twohundred
file1 et file2 auront toujours le même nombre de lignes dans mon scénario, au cas où cela rendrait les choses plus faciles.
Réponses:
Le bon outil pour ce travail est probablement paste
paste -d '' file1 file2
Voir man paste
pour plus de détails.
Vous pouvez également utiliser la pr
commande:
pr -TmJS"" file1 file2
où
-T
désactive la pagination-mJ
fichiers m erge, J oining lignes complètes-S""
séparez les colonnes avec une chaîne vide Si vous vouliez vraiment le faire en utilisant du shell bash pur (non recommandé), voici ce que je suggérerais:
while IFS= read -u3 -r a && IFS= read -u4 -r b; do
printf '%s%s\n' "$a" "$b"
done 3<file1 4<file2
(N'inclure cela que parce que le sujet a fait des commentaires sur une autre solution proposée de pure-bash.)
Par le biais de manière awk :
awk '{getline x<"file2"; print $0x}' file1
getline x<"file2"
lit la ligne entière à partir de file2 et contient la variable x .print $0x
imprime la ligne entière du fichier1 en utilisant $0
alors x
qui est la ligne enregistrée du fichier2 .paste
est la voie à suivre . Si vous souhaitez vérifier d'autres méthodes, voici une python
solution:
#!/usr/bin/env python2
import itertools
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
lines = itertools.izip_longest(f1, f2)
for a, b in lines:
if a and b:
print a.rstrip() + b.rstrip()
else:
if a:
print a.rstrip()
else:
print b.rstrip()
Si vous avez peu de lignes:
#!/usr/bin/env python2
with open('/path/to/file1') as f1, open('/path/to/file2') as f2:
print '\n'.join((a.rstrip() + b.rstrip() for a, b in zip(f1, f2)))
Notez que pour un nombre inégal de lignes, celle-ci se terminera à la dernière ligne du fichier qui se termine en premier.
Aussi, avec pure bash
(notez que cela ignorera totalement les lignes vides):
#!/bin/bash
IFS=$'\n' GLOBIGNORE='*'
f1=($(< file1))
f2=($(< file2))
i=0
while [ "${f1[${i}]}" ] && [ "${f2[${i}]}" ]
do
echo "${f1[${i}]}${f2[${i}]}" >> out
((i++))
done
while [ "${f1[${i}]}" ]
do
echo "${f1[${i}]}" >> out
((i++))
done
while [ "${f2[${i}]}" ]
do
echo "${f2[${i}]}" >> out
((i++))
done
mapfile
pour lire les fichiers dans des tableaux, soit utiliser une boucle while avec deux read
commandes, lisant chacune de leur fd.
array=( $(cmd) )
ou array=( $var )
. Utilisez mapfile
plutôt.
La façon Perl, facile à comprendre:
#!/usr/bin/perl
$filename1=$ARGV[0];
$filename2=$ARGV[1];
open(my $fh1, "<", $filename1) or die "cannot open < $filename1: $!";
open(my $fh2, "<", $filename2) or die "cannot open < $filename2: $!";
my @array1;
my @array2;
while (my $line = <$fh1>) {
chomp $line;
push @array1, $line;
}
while (my $line = <$fh2>) {
chomp $line;
push @array2, $line;
}
for my $i (0 .. $#array1) {
print @array1[$i].@array2[$i]."\n";
}
Commencer avec:
./merge file1 file2
Sortie:
foobar
icecream
twohundred