我正在寻找一种使用拉链方法(也称为后期合并)逐行合并两个或多个文件的好方法。假设我们有三个文件,结果应如下所示:
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
fromcoreutils
来做这类事情:
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
这至少是解决你的任务的一种可能性。