code: def merge(args):
      
      from jcvi.apps.grid import MakeManager
  
      p = OptionParser(merge.__doc__)
      p.set_sep(sep="_", help="Separator to group per prefix")
      opts, args = p.parse_args(args)
  
      if len(args) < 2:
          sys.exit(not p.print_help())
  
      merged_bams = args[0]
      bamdirs = args[1:]
  
      mkdir(merged_bams)
      bams = []
      for x in bamdirs:
          bams += glob(op.join(x, "*.bam"))
      bams = [x for x in bams if "nsorted" not in x]
  
      logging.debug("Found a total of {0} BAM files.".format(len(bams)))
  
      sep = opts.sep
      key = lambda x: op.basename(x).split(sep)[0]
      bams.sort(key=key)
      mm = MakeManager()
      for prefix, files in groupby(bams, key=key):
          files = sorted(list(files))
          nfiles = len(files)
          source = " ".join(files)
          target = op.join(merged_bams, op.basename(files[0]))
          if nfiles == 1:
              source = get_abs_path(source)
              cmd = "ln -s {0} {1}".format(source, target)
              mm.add("", target, cmd)
          else:
              cmd = "samtools merge -@ 8 {0} {1}".format(target, source)
              mm.add(files, target, cmd, remove=True)
      mm.write()
docs: %prog merge merged_bams bams1_dir bams2_dir ...
  
      Merge BAM files. Treat the bams with the same prefix as a set.
      Output the commands first.