Файлы слияния с помощью метода застежки-молнии / поздно объединяются

хвост-f был способом пойти ty. Я спрошу больше о FIFOs позже ;)

7
02.09.2012, 14:01
3 ответа

Я обычно использую paste от coreutils для этого вида вещи:

paste -d'\n' file1 file2 file3
6
27.01.2020, 20:17
  • 1
    Хороший, стандартный инструмент. Но к сожалению paste печать много пустых строк, если файлы имеют неравную длину. –  scai 12.08.2012, 15:50
  • 2
    В зависимости от того, в чем Вы нуждаетесь, Вы могли удалить пустые строки путем добавления: | grep -v '^$'. –  Thor 12.08.2012, 16:38
  • 3
    Это корректно, но конечно только работает, если указанные файлы не имеют самих пустых строк. –  scai 12.08.2012, 17:57

я записал немного сценария жемчуга, которые делают это

#!/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

Это - по крайней мере одна возможность решить Вашу задачу.

2
27.01.2020, 20:17
  • 1
    Спасибо за Ваш хороший сценарий, но к сожалению я могу только принять один ответ, таким образом, я выбрал тот с помощью стандартного инструмента. –  scai 02.09.2012, 13:57

Другая версия 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 также.

2
27.01.2020, 20:17
  • 1
    Спасибо за Ваш хороший сценарий, но к сожалению я могу только принять один ответ, таким образом, я выбрал тот с помощью стандартного инструмента. –  scai 02.09.2012, 13:58

Теги

Похожие вопросы