/
merges.py
51 lines (39 loc) · 1.25 KB
/
merges.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
"""
merges: Merge multiple sorted files
"""
from __future__ import division
import heapq
import argparse
import sys
import six
__version__ = '0.1.0'
__all__ = ['main', '__version__']
def main():
parser = argparse.ArgumentParser(description='Merge multiple sorted files')
parser.add_argument('-c', '--col', type=int, default=-1, help='column index (starts from 0)')
parser.add_argument('-n', '--numeric', action='store_true', help='numeric sort')
parser.add_argument('--sep', type=str, default=',', help='column separator')
parser.add_argument('files', metavar='files', type=str, nargs='+', help='input files')
args = parser.parse_args()
col = args.col
numeric = args.numeric
sep = six.u(args.sep)
files = [open(filename, 'r') for filename in args.files]
if col != -1:
if numeric:
conv = float
else:
conv = str
tuples = (
((conv(line.split(sep)[col]), line) for line in file)
for file in files
)
merged = heapq.merge(*tuples)
for key, line in merged:
sys.stdout.write(line)
else:
merged = heapq.merge(*files)
for line in merged:
sys.stdout.write(line)
if __name__ == '__main__':
main()