Я обычно использую paste
от coreutils
для этого вида вещи:
paste -d'\n' file1 file2 file3
я записал немного сценария жемчуга, которые делают это
#!/usr/bin/perl
do { open($fh[$_], "<$ARGV[$_]") or die("'$ARGV[$_]' does not exist") } for(0..$#ARGV);
for($i=0;;$i++) {
$j=$#ARGV+1;
$fh = $fh[$i%$j];
if ( $_ = <$fh> ) {
print $_;
} else {
$end |= 2**($i%$j);
}
if($end == (2**($j))-1) {
last;
}
}
close($_) for(@fh);
сохраните его в файл вызов он как
script.pl file1 file2 file3 ... > merge
Это - по крайней мере одна возможность решить Вашу задачу.
Другая версия Python, которая не должна читать все файлы в память сразу:
paddy$ more f[123].tmp
::::::::::::::
f1.tmp
::::::::::::::
line1 file1
line2 file1
line3 file1
::::::::::::::
f2.tmp
::::::::::::::
line1 file2
line2 file2
line3 file2
line4 file2
::::::::::::::
f3.tmp
::::::::::::::
line1 file3
line2 file3
line3 file3
line4 file3
line5 file3
paddy$ python2.7 -c 'import sys, itertools
files = [open(fname) for fname in sys.argv[1:]]
sys.stdout.write("".join("".join(lines) for lines in itertools.izip_longest(*files, fillvalue="") ))' f[123].tmp
line1 file1
line1 file2
line1 file3
line2 file1
line2 file2
line2 file3
line3 file1
line3 file2
line3 file3
line4 file2
line4 file3
line5 file3
paddy@paddy-ThinkPad-T61:~$
Замените izip_longest zip_longest, и он будет работать в Python 3.x также.
paste
печать много пустых строк, если файлы имеют неравную длину. – scai 12.08.2012, 15:50| grep -v '^$'
. – Thor 12.08.2012, 16:38