kkonganti@0: #!/usr/bin/env python3 kkonganti@0: kkonganti@0: # Kranti Konganti kkonganti@0: kkonganti@0: import argparse kkonganti@0: import inspect kkonganti@0: import logging kkonganti@0: import os kkonganti@0: import pprint kkonganti@0: kkonganti@0: kkonganti@0: # Multiple inheritence for pretty printing of help text. kkonganti@0: class MultiArgFormatClasses(argparse.RawTextHelpFormatter, argparse.ArgumentDefaultsHelpFormatter): kkonganti@0: pass kkonganti@0: kkonganti@0: kkonganti@0: # Main kkonganti@0: def main() -> None: kkonganti@0: """ kkonganti@0: This script takes as input two files containing non whitespace lines and will kkonganti@0: output lines if it is present in both files. kkonganti@0: """ kkonganti@0: kkonganti@0: # Set logging. kkonganti@0: logging.basicConfig( kkonganti@0: format="\n" + "=" * 55 + "\n%(asctime)s - %(levelname)s\n" + "=" * 55 + "\n%(message)s\n\n", kkonganti@0: level=logging.DEBUG, kkonganti@0: ) kkonganti@0: kkonganti@0: # Debug print. kkonganti@0: ppp = pprint.PrettyPrinter(width=55) kkonganti@0: prog_name = os.path.basename(inspect.stack()[0].filename) kkonganti@0: kkonganti@0: parser = argparse.ArgumentParser( kkonganti@0: prog=prog_name, description=main.__doc__, formatter_class=MultiArgFormatClasses kkonganti@0: ) kkonganti@0: kkonganti@0: required = parser.add_argument_group("required arguments") kkonganti@0: kkonganti@0: required.add_argument( kkonganti@0: "-f1", kkonganti@0: dest="file1", kkonganti@0: default=False, kkonganti@0: required=True, kkonganti@0: help="Absolute UNIX path to file no. 1 containing\nnon white space lines.", kkonganti@0: ) kkonganti@0: required.add_argument( kkonganti@0: "-f2", kkonganti@0: dest="file2", kkonganti@0: default=False, kkonganti@0: required=True, kkonganti@0: help="Absolute UNIX path to file no. 2 containing\nnon white space lines.", kkonganti@0: ) kkonganti@0: parser.add_argument( kkonganti@0: "-out", kkonganti@0: dest="outfile", kkonganti@0: default="accs_passed.txt", kkonganti@0: help="The following output file will be created in\nthe current working directory.", kkonganti@0: ) kkonganti@0: kkonganti@0: args = parser.parse_args() kkonganti@0: f1 = args.file1 kkonganti@0: f2 = args.file2 kkonganti@0: out = args.outfile kkonganti@0: f1d = dict() kkonganti@0: f2d = dict() kkonganti@0: kkonganti@0: # Basic checks kkonganti@0: kkonganti@0: if not (os.path.exists(f1) and os.path.exists(f2)): kkonganti@0: logging.error( kkonganti@0: f"File {os.path.basename(f1)} or" + f"\nFile {os.path.basename(f2)} does not exist." kkonganti@0: ) kkonganti@0: exit(1) kkonganti@0: elif not (os.path.getsize(f1) > 0 and os.path.getsize(f2) > 0): kkonganti@0: logging.error( kkonganti@0: f"File {os.path.basename(f1)} or" + f"\nFile {os.path.basename(f2)} is empty." kkonganti@0: ) kkonganti@0: exit(1) kkonganti@0: kkonganti@0: with open(f1, "r") as f1_fh: kkonganti@0: for line in f1_fh: kkonganti@0: f1d[line.strip()] = 1 kkonganti@0: kkonganti@0: with open(f2, "r") as f2_fh: kkonganti@0: for line in f2_fh: kkonganti@0: f2d[line.strip()] = 1 kkonganti@0: kkonganti@0: big = f1d kkonganti@0: small = f2d kkonganti@0: kkonganti@0: if len(f1d.keys()) < len(f2d.keys()): kkonganti@0: big = f2d kkonganti@0: small = f1d kkonganti@0: kkonganti@0: with open(out, "w") as out_fh: kkonganti@0: for line in small.keys(): kkonganti@0: if line in big.keys(): kkonganti@0: out_fh.write(line + "\n") kkonganti@0: kkonganti@0: f1_fh.close() kkonganti@0: f2_fh.close() kkonganti@0: out_fh.close() kkonganti@0: kkonganti@0: kkonganti@0: if __name__ == "__main__": kkonganti@0: main()