code: def sort_merge(in_file, data, out_dir=None):
      
      out_file = "%s-sortmerge.bed" % os.path.splitext(in_file)[0]
      bedtools = config_utils.get_program("bedtools", data, default="bedtools")
      if out_dir:
          out_file = os.path.join(out_dir, os.path.basename(out_file))
      if not utils.file_uptodate(out_file, in_file):
          column_opt = ""
          with utils.open_gzipsafe(in_file) as in_handle:
              for line in in_handle:
                  if not line.startswith(("#", "track", "browser", "@")):
                      parts = line.split()
                      if len(parts) >= 4:
                          column_opt = "-c 4 -o distinct"
          with file_transaction(data, out_file) as tx_out_file:
              cat_cmd = "zcat" if in_file.endswith(".gz") else "cat"
              sort_cmd = get_sort_cmd(os.path.dirname(tx_out_file))
              cmd = ("{cat_cmd} {in_file} | {sort_cmd} -k1,1 -k2,2n | "
                     "{bedtools} merge -i - {column_opt} > {tx_out_file}")
              do.run(cmd.format(**locals()), "Sort and merge BED file", data)
      return out_file
docs: Sort and merge a BED file, collapsing gene names.
         Output is a 3 or 4 column file (the 4th column values go comma-separated).