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.usesortコマンドは必要ありません。

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

これは、5桁が常に存在し、常に連続していると仮定していますが、そこから取得できます. コードをファイルに入れ、追加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 に答える