尝试输出连接两个文件的所有可能组合

时间:2013-10-22 09:43:04

标签: join terminal grep cat

我有一个包含24个不同文件的文件夹,这些文件都具有相同的制表符分隔格式:

这是一个例子:

zinc-n  with-iodide-n   8.0430  X
zinc-n  with-amount-of-supplement-n 12.7774 X
zinc-n  with-value-of-horizon-n 14.5585 X
zirconium-n as-valence-n    11.3255 X
zirconium-n for-form-of-norm-n  15.4607 X

我想以2的每种可能组合加入文件。

例如,我想加入文件1和文件2,文件1和文件3,文件1和文件4 ......等等,直到我有552个文件的输出加入EACH文件与EACH其他文件考虑所有独特的组合

我知道这可以在例如带猫的终端中完成。

cat File1 File2 > File1File2
cat File1 File3 > File1File3

......等等。

但是,为每个独特的组合做这件事将是一个非常费力的过程。

是否可以自动化此过程以使用终端中的命令行加入所有唯一组合,例如grep?或者可能是针对比CAT更优化的解决方案的另一个建议。

1 个答案:

答案 0 :(得分:1)

您可以尝试使用。我使用combinations()模块中的itertools函数和join()每对文件的内容。请注意,我使用缓存来避免多次读取每个文件,但您可能会耗尽内存,因此请使用最佳方法:

import sys 
import itertools

seen = {}

for files in itertools.combinations(sys.argv[1:], 2): 
    outfile = ''.join(files)
    oh = open(outfile, 'w')

    if files[0] in seen:
        f1_data = seen[files[0]]
    else:
        f1_data = open(files[0], 'r').read()
        seen[files[0]] = f1_data

    if files[1] in seen:
        f2_data = seen[files[1]]
    else:
        f2_data = open(files[1], 'r').read()
        seen[files[1]] = f2_data

    print('\n'.join([f1_data, f2_data]), file=oh)

测试:

假设以下三个文件的内容:

==> file1 <==
file1 one
f1 two

==> file2 <==
file2 one
file2 two

==> file3 <==
file3 one
f3 two
f3 three

运行如下脚本:

python3 script.py file[123]

它将创建三个包含内容的新文件:

==> file1file2 <==
file1 one
f1 two
file2 one
file2 two


==> file1file3 <==
file1 one
f1 two
file3 one
f3 two
f3 three


==> file2file3 <==
file2 one
file2 two
file3 one
f3 two
f3 three