gato archivo1
foo
ice
two
cat file2
bar
cream
hundred
Salida deseada:
foobar
icecream
twohundred
file1 y file2 siempre tendrán la misma cantidad de líneas en mi escenario, en caso de que eso facilite las cosas.
gato archivo1
foo
ice
two
cat file2
bar
cream
hundred
Salida deseada:
foobar
icecream
twohundred
file1 y file2 siempre tendrán la misma cantidad de líneas en mi escenario, en caso de que eso facilite las cosas.
Respuestas:
La herramienta adecuada para este trabajo es probablemente paste
paste -d '' file1 file2
Ver man paste
para más detalles.
También puedes usar el pr
comando:
pr -TmJS"" file1 file2
dónde
-T
apaga la paginación-mJ
m archivos erge, J líneas completas oining-S""
separe las columnas con una cadena vacía Si realmente quisieras hacerlo usando bash shell puro (no recomendado), entonces esto es lo que sugeriría:
while IFS= read -u3 -r a && IFS= read -u4 -r b; do
printf '%s%s\n' "$a" "$b"
done 3<file1 4<file2
(Solo se incluye esto porque el tema surgió en los comentarios a otra solución de bash puro propuesta).
A través de awk way:
awk '{getline x<"file2"; print $0x}' file1
getline x<"file2"
lee la línea completa del archivo2 y la mantiene en la variable x .print $0x
imprime toda la línea desde el archivo1 usando $0
luego x
cuál es la línea guardada del archivo2 .paste
Es el camino a seguir . Si desea verificar otros métodos, aquí hay una python
solución:
#!/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 tiene pocas líneas:
#!/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)))
Tenga en cuenta que para un número desigual de líneas, esta terminará en la última línea del archivo que termina primero.
Además, con pure bash
(tenga en cuenta que esto ignorará totalmente las líneas vacías):
#!/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
para leer los archivos en matrices, o use un bucle while con dos read
comandos, leyendo de cada uno su fd.
array=( $(cmd) )
o array=( $var )
. Usar en su mapfile
lugar.
La manera perl, fácil de entender:
#!/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";
}
Empezar con:
./merge file1 file2
Salida:
foobar
icecream
twohundred