지퍼 방식(병합 후라고도 함)을 사용하여 두 개 이상의 파일을 한 줄씩 병합하는 좋은 방법을 찾고 있습니다. 세 개의 파일이 있다고 가정하면 결과는 다음과 같습니다.
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
나는 보통 이런 종류의 일에 paste
from을 사용합니다.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
이는 귀하의 작업을 해결하기 위한 적어도 하나의 가능성입니다.