file cat1
foo
ice
two
cat file2
bar
cream
hundred
Uscita desiderata:
foobar
icecream
twohundred
file1 e file2 avranno sempre la stessa quantità di righe nel mio scenario, nel caso ciò semplifichi le cose.
file cat1
foo
ice
two
cat file2
bar
cream
hundred
Uscita desiderata:
foobar
icecream
twohundred
file1 e file2 avranno sempre la stessa quantità di righe nel mio scenario, nel caso ciò semplifichi le cose.
Risposte:
Lo strumento giusto per questo lavoro è probabilmente paste
paste -d '' file1 file2
Vedi man paste
per i dettagli.
Puoi anche usare il pr
comando:
pr -TmJS"" file1 file2
dove
-T
disattiva l'impaginazione-mJ
m file si erge, J oining linee complete-S""
separare le colonne con una stringa vuota Se davvero volessi farlo usando pure bash shell (non raccomandato), allora questo è ciò che suggerirei:
while IFS= read -u3 -r a && IFS= read -u4 -r b; do
printf '%s%s\n' "$a" "$b"
done 3<file1 4<file2
(Includendo questo perché l'argomento è emerso nei commenti a un'altra proposta di soluzione pure-bash.)
Attraverso awk way:
awk '{getline x<"file2"; print $0x}' file1
getline x<"file2"
legge l'intera riga da file2 e contiene la variabile x .print $0x
stampa l'intera riga da file1 utilizzando $0
quindi x
quale è la riga salvata di file2 .paste
è la strada da percorrere . Se vuoi controllare alcuni altri metodi, ecco una python
soluzione:
#!/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 hai un numero limitato di righe:
#!/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)))
Si noti che per un numero di righe diverso, questo termina all'ultima riga del file che termina per primo.
Inoltre, con pure bash
(notare che questo ignorerà totalmente le righe vuote):
#!/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
per leggere i file in array o utilizzare un ciclo while con due read
comandi, leggendo da ciascuno il loro fd.
array=( $(cmd) )
o array=( $var )
. Usa mapfile
invece.
Il modo perl, facile da capire:
#!/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";
}
Iniziare con:
./merge file1 file2
Produzione:
foobar
icecream
twohundred