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