按特定列中的数字排序

时间:2012-10-08 08:56:41

标签: perl unix sorting

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

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

2 个答案:

答案 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) } <>