A ferramenta certa para este trabalho provavelmente é paste
paste -d '' file1 file2
Veja man paste
para detalhes.
cat file1
foo
ice
two
cat file2
bar
cream
hundred
Saída desejada:
foobar
icecream
twohundred
file1 e file2 sempre terão a mesma quantidade de linhas no meu cenário, no caso de facilitar as coisas.
A ferramenta certa para este trabalho provavelmente é paste
paste -d '' file1 file2
Veja man paste
para detalhes.
Através do método awk :
awk '{getline x<"file2"; print $0x}' file1
getline x<"file2"
lê a linha inteira de arquivo2 e mantém a variável x . print $0x
imprime a linha inteira de arquivo1 usando $0
, em seguida, x
, que é a linha salva de arquivo2 . paste
é o caminho a percorrer . Se você quiser verificar alguns outros métodos, aqui está uma 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()
Se você tiver poucas linhas:
#!/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)))
Note que, para um número desigual de linhas, esta terminará na última linha do arquivo que termina primeiro.
Além disso, com bash
puro (observe que isso ignorará totalmente as linhas vazias):
#!/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
O caminho 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";
}
Comece com:
./merge file1 file2
Saída:
foobar
icecream
twohundred
Tags bash text-processing perl awk sed