Repository navigation
Expand file tree
/
Copy pathmx-fa-sortseqlen
More file actions
executable file
·52 lines (47 loc) · 1.73 KB
/
Copy pathmx-fa-sortseqlen
File metadata and controls
executable file
·52 lines (47 loc) · 1.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# vim:fileencoding=utf-8
"""
SORT FASTA BY SEQUENCE LENGTH
James B. Pease
"""
import os
import sys
import argparse
from pylib.mixcore import _LICENSE
from pylib.mixcore import fasta_iter
def generate_argparser():
parser = argparse.ArgumentParser(
description=__doc__,
formatter_class=argparse.RawTextHelpFormatter,
epilog=_LICENSE)
parser.add_argument('fasta', type=os.path.abspath,
help="input fasta file")
parser.add_argument('--out', type=argparse.FileType('w'),
default=sys.stdout, help="output fasta file")
parser.add_argument('--ignore-chars', help=(
"Ignore the characters in the string when counting."
"For example, use '-' to ignore gaps or '-N' for gaps and N's."))
parser.add_argument('--sort-labels-next', action="store_true", help=(
"After sorting by length, next sort by label."))
return parser
def main(arguments=None):
arguments = arguments if arguments is not None else sys.argv[1:]
parser = generate_argparser()
args = parser.parse_args(args=arguments)
seqs = []
for hdr, seq in fasta_iter(args.fasta):
if args.ignore_chars:
seqlen = sum((0 if x in args.ignore_chars else 1 for x in seq))
else:
seqlen = len(seq)
seqs.append((seqlen, hdr, seq))
if args.sort_labels_next is True:
for _, hdr, seq in sorted(seqs):
print(">{}\n{}".format(hdr, seq), file=args.out)
else:
for _, hdr, seq in sorted(seqs, key=lambda x:x[0]):
print(">{}\n{}".format(hdr, seq), file=args.out)
return ''
if __name__ == '__main__':
main()