Perl 按特定列中的数字排序
我有这种格式的数据(制表符分隔列) …我想按第9列中的前5个数字按升序排序。即,文件如下所示:Perl 按特定列中的数字排序,perl,unix,sorting,Perl,Unix,Sorting,我有这种格式的数据(制表符分隔列) …我想按第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;Paren
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,但我的技能非常有限……不需要Perl。在Unix中使用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
不需要perl。在unix中使用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
如果确实要按第9列中的前5位进行排序, 这是您无法向
sort
解释的,但正如您所建议的,perl
更灵活:
perl -e 'sub key { 0+((split(/\s+/,$_[0]))[8] =~ /(\d{5})/)[0] }; print sort { key($a) <=> key($b) } <>' < unsorted > sorted
如果确实要按第9列中的前5位进行排序, 这是您无法向
sort
解释的,但正如您所建议的,perl
更灵活:
perl -e 'sub key { 0+((split(/\s+/,$_[0]))[8] =~ /(\d{5})/)[0] }; print sort { key($a) <=> key($b) } <>' < unsorted > sorted
这是正确的吗?我试了另一个文件。此命令将此“ID=TAXON\U 00013T0”放在第9列的“ID=TAXON\U 00002T0”之前。第二个数字比第一个小,你确定吗?我用同样的数字试过了,它的打印正确吗?我试了另一个文件。此命令将此“ID=TAXON\U 00013T0”放在第9列的“ID=TAXON\U 00002T0”之前。第二个数字比第一个小,你确定吗?我用同样的数字试过了,它的打印正确了。我是否误解了这里的某些内容?我得到了这个错误消息:由于编译错误,“/(\d{5})/}”附近的-e第1行出现语法错误。我使用了这个命令:
perl-e'sub-key{((split(/\s+/,$[0])[8]=~/(\d{5})/};print sort{key($a)key($b)}'sort test out.txt
对不起,我粘贴了错误的版本:(这一个应该更好。我还添加了一个扩展版本。我在这里误解了什么吗?我得到了这个错误消息:语法错误在-e行1,靠近“/(\d{5})/}”执行-e由于编译错误而中止。我使用了这个命令:perl-e'sub-key{(split(/\s+/,$[0])[8]=~/(\d{5})/};打印排序{key($a)key($b)}“sort test out.txt
对不起,我粘贴了错误的版本:(这个应该更好。我还添加了一个扩展版本。