지퍼 방식/병합 후를 사용하여 파일 병합

지퍼 방식/병합 후를 사용하여 파일 병합

지퍼 방식(병합 후라고도 함)을 사용하여 두 개 이상의 파일을 한 줄씩 병합하는 좋은 방법을 찾고 있습니다. 세 개의 파일이 있다고 가정하면 결과는 다음과 같습니다.

line1 file1
line1 file2
line1 file3
line2 file1
line2 file2
line2 file3
...

편집하다

나는 이 작업을 수행하는 작은 Python 스크립트를 작성했습니다.

#!/usr/bin/python

import sys, itertools

fileList = []
for file in sys.argv[1:]:
    f = open(file, "r")
    fileList.append(f.read().split("\n"))

for z in itertools.izip_longest(*fileList):
    print "\n".join([i for i in z if i is not None])

동일한 작업을 수행할 수 있는 표준 도구나 이들의 영리한 조합이 있는지 알고 싶습니다.

답변1

나는 보통 이런 종류의 일에 pastefrom을 사용합니다.coreutils

paste -d'\n' file1 file2 file3

답변2

모든 파일을 한 번에 메모리로 읽어올 필요가 없는 또 다른 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에서도 작동합니다.

답변3

나는 이것을 수행하는 Perl 스크립트를 작성했습니다.

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

이는 귀하의 작업을 해결하기 위한 적어도 하나의 가능성입니다.

관련 정보