kkonganti@11
|
1 #!/usr/bin/env python3
|
kkonganti@11
|
2
|
kkonganti@11
|
3 # Kranti Konganti
|
kkonganti@11
|
4
|
kkonganti@11
|
5 import argparse
|
kkonganti@11
|
6 import inspect
|
kkonganti@11
|
7 import logging
|
kkonganti@11
|
8 import os
|
kkonganti@11
|
9 import pprint
|
kkonganti@11
|
10
|
kkonganti@11
|
11
|
kkonganti@11
|
12 # Multiple inheritence for pretty printing of help text.
|
kkonganti@11
|
13 class MultiArgFormatClasses(argparse.RawTextHelpFormatter, argparse.ArgumentDefaultsHelpFormatter):
|
kkonganti@11
|
14 pass
|
kkonganti@11
|
15
|
kkonganti@11
|
16
|
kkonganti@11
|
17 # Main
|
kkonganti@11
|
18 def main() -> None:
|
kkonganti@11
|
19 """
|
kkonganti@11
|
20 This script takes as input two files containing non whitespace lines and will
|
kkonganti@11
|
21 output lines if it is present in both files.
|
kkonganti@11
|
22 """
|
kkonganti@11
|
23
|
kkonganti@11
|
24 # Set logging.
|
kkonganti@11
|
25 logging.basicConfig(
|
kkonganti@11
|
26 format="\n" + "=" * 55 + "\n%(asctime)s - %(levelname)s\n" + "=" * 55 + "\n%(message)s\n\n",
|
kkonganti@11
|
27 level=logging.DEBUG,
|
kkonganti@11
|
28 )
|
kkonganti@11
|
29
|
kkonganti@11
|
30 # Debug print.
|
kkonganti@11
|
31 ppp = pprint.PrettyPrinter(width=55)
|
kkonganti@11
|
32 prog_name = os.path.basename(inspect.stack()[0].filename)
|
kkonganti@11
|
33
|
kkonganti@11
|
34 parser = argparse.ArgumentParser(
|
kkonganti@11
|
35 prog=prog_name, description=main.__doc__, formatter_class=MultiArgFormatClasses
|
kkonganti@11
|
36 )
|
kkonganti@11
|
37
|
kkonganti@11
|
38 required = parser.add_argument_group("required arguments")
|
kkonganti@11
|
39
|
kkonganti@11
|
40 required.add_argument(
|
kkonganti@11
|
41 "-f1",
|
kkonganti@11
|
42 dest="file1",
|
kkonganti@11
|
43 default=False,
|
kkonganti@11
|
44 required=True,
|
kkonganti@11
|
45 help="Absolute UNIX path to file no. 1 containing\nnon white space lines.",
|
kkonganti@11
|
46 )
|
kkonganti@11
|
47 required.add_argument(
|
kkonganti@11
|
48 "-f2",
|
kkonganti@11
|
49 dest="file2",
|
kkonganti@11
|
50 default=False,
|
kkonganti@11
|
51 required=True,
|
kkonganti@11
|
52 help="Absolute UNIX path to file no. 2 containing\nnon white space lines.",
|
kkonganti@11
|
53 )
|
kkonganti@11
|
54 parser.add_argument(
|
kkonganti@11
|
55 "-out",
|
kkonganti@11
|
56 dest="outfile",
|
kkonganti@11
|
57 default="accs_passed.txt",
|
kkonganti@11
|
58 help="The following output file will be created in\nthe current working directory.",
|
kkonganti@11
|
59 )
|
kkonganti@11
|
60
|
kkonganti@11
|
61 args = parser.parse_args()
|
kkonganti@11
|
62 f1 = args.file1
|
kkonganti@11
|
63 f2 = args.file2
|
kkonganti@11
|
64 out = args.outfile
|
kkonganti@11
|
65 f1d = dict()
|
kkonganti@11
|
66 f2d = dict()
|
kkonganti@11
|
67
|
kkonganti@11
|
68 # Basic checks
|
kkonganti@11
|
69
|
kkonganti@11
|
70 if not (os.path.exists(f1) and os.path.exists(f2)):
|
kkonganti@11
|
71 logging.error(
|
kkonganti@11
|
72 f"File {os.path.basename(f1)} or" + f"\nFile {os.path.basename(f2)} does not exist."
|
kkonganti@11
|
73 )
|
kkonganti@11
|
74 exit(1)
|
kkonganti@11
|
75 elif not (os.path.getsize(f1) > 0 and os.path.getsize(f2) > 0):
|
kkonganti@11
|
76 logging.error(
|
kkonganti@11
|
77 f"File {os.path.basename(f1)} or" + f"\nFile {os.path.basename(f2)} is empty."
|
kkonganti@11
|
78 )
|
kkonganti@11
|
79 exit(1)
|
kkonganti@11
|
80
|
kkonganti@11
|
81 with open(f1, "r") as f1_fh:
|
kkonganti@11
|
82 for line in f1_fh:
|
kkonganti@11
|
83 f1d[line.strip()] = 1
|
kkonganti@11
|
84
|
kkonganti@11
|
85 with open(f2, "r") as f2_fh:
|
kkonganti@11
|
86 for line in f2_fh:
|
kkonganti@11
|
87 f2d[line.strip()] = 1
|
kkonganti@11
|
88
|
kkonganti@11
|
89 big = f1d
|
kkonganti@11
|
90 small = f2d
|
kkonganti@11
|
91
|
kkonganti@11
|
92 if len(f1d.keys()) < len(f2d.keys()):
|
kkonganti@11
|
93 big = f2d
|
kkonganti@11
|
94 small = f1d
|
kkonganti@11
|
95
|
kkonganti@11
|
96 with open(out, "w") as out_fh:
|
kkonganti@11
|
97 for line in small.keys():
|
kkonganti@11
|
98 if line in big.keys():
|
kkonganti@11
|
99 out_fh.write(line + "\n")
|
kkonganti@11
|
100
|
kkonganti@11
|
101 f1_fh.close()
|
kkonganti@11
|
102 f2_fh.close()
|
kkonganti@11
|
103 out_fh.close()
|
kkonganti@11
|
104
|
kkonganti@11
|
105
|
kkonganti@11
|
106 if __name__ == "__main__":
|
kkonganti@11
|
107 main()
|