0

我有这种格式的数据(制表符分隔的列)...

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,但我的技能非常有限......

4

2 回答 2

3

在 unix 中不需要 perl.use 排序命令。

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
于 2012-10-08T09:05:08.103 回答
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) } <>
于 2012-10-08T09:25:39.697 回答