我有这种格式的数据(制表符分隔列)...
Name_00001 Annotation_1 gene 329412 330509 . - . ID=TAXON_00029;Name=TAXON_00029
Name_00001 Annotation_1 mRNA 329412 330509 . - . ID=TAXON_00029T0;Parent=TAXON_00029
Name_00001 Annotation_1 exon 193957 194252 . + . ID=exon:TAXON_00022T0:1;Parent=TAXON_00022T0
Name_00001 Annotation_1 exon 195500 197118 . + . ID=exon:TAXON_00022T0:2;Parent=TAXON_00022T0
...我希望按照第9列中的前5个数字按升序排序。即所以文件看起来像这样:
Name_00001 Annotation_1 exon 193957 194252 . + . ID=exon:TAXON_00022T0:1;Parent=TAXON_00022T0
Name_00001 Annotation_1 exon 195500 197118 . + . ID=exon:TAXON_00022T0:2;Parent=TAXON_00022T0
Name_00001 Annotation_1 gene 329412 330509 . - . ID=TAXON_00029;Name=TAXON_00029
Name_00001 Annotation_1 mRNA 329412 330509 . - . ID=TAXON_00029T0;Parent=TAXON_00029
我曾尝试使用Unix或Perl,但我的技能非常有限......
答案 0 :(得分:3)
在unix中不需要perl.use sort命令。
sort -k 9 -n your_file
测试如下:
> cat temp
Name_00001 Annotation_1 gene 329412 330509 . - . ID=TAXON_00029;Name=TAXON_00029
Name_00001 Annotation_1 mRNA 329412 330509 . - . ID=TAXON_00029T0;Parent=TAXON_00029
Name_00001 Annotation_1 exon 193957 194252 . + . ID=exon:TAXON_00022T0:1;Parent=TAXON_00022T0
Name_00001 Annotation_1 exon 195500 197118 . + . ID=exon:TAXON_00022T0:2;Parent=TAXON_00022T0
> sort -k 9 -n temp
Name_00001 Annotation_1 exon 193957 194252 . + . ID=exon:TAXON_00022T0:1;Parent=TAXON_00022T0
Name_00001 Annotation_1 exon 195500 197118 . + . ID=exon:TAXON_00022T0:2;Parent=TAXON_00022T0
Name_00001 Annotation_1 gene 329412 330509 . - . ID=TAXON_00029;Name=TAXON_00029
Name_00001 Annotation_1 mRNA 329412 330509 . - . ID=TAXON_00029T0;Parent=TAXON_00029
也测试了评论:
> cat temp
Name_00001 Annotation_1 mRNA 329412 330509 . - . ID=TAXON_00013T0;Parent=TAXON_00029
Name_00001 Annotation_1 exon 193957 194252 . + . ID=exon:TAXON_00002T0:1;Parent=TAXON_00022T0
> sort -k 9 -n temp
Name_00001 Annotation_1 exon 193957 194252 . + . ID=exon:TAXON_00002T0:1;Parent=TAXON_00022T0
Name_00001 Annotation_1 mRNA 329412 330509 . - . ID=TAXON_00013T0;Parent=TAXON_00029
答案 1 :(得分:1)
如果您真的想按第9列中的前5个数字排序,
这是你无法向sort
字面解释的内容,但正如你的建议,perl
更灵活:
perl -e 'sub key { 0+((split(/\s+/,$_[0]))[8] =~ /(\d{5})/)[0] }; print sort { key($a) <=> key($b) } <>' < unsorted > sorted
这假设五个数字始终存在且始终是连续的,但您可以从那里获取它。
最好将代码放入文件中,添加use warnings; use strict;
并增加易读性:
#!/usr/bin/env perl
use strict;
use warnings;
sub key {
my $line = $_[0];
my @fields = split(/\s+/,$line);
my ($keystring) = $fields[8] =~ /(\d{5})/;
my $key = 0 + $keystring;
$key
}
print sort { key($a) <=> key($b) } <>