按字母顺序对列进行排序

时间:2016-05-04 19:21:44

标签: sorting columnsorting

我有以下文件,我想根据第6列以字母数字方式对其进行排序,以便E1之后是I1,然后是E2,依此类推特定ID之前的' :',当我对-V -k6文件进行排序时,它会把所有的ID放在最后而不是它们应该放在哪里。但是当我对它进行排序-k6时,它确实将ID的Es和Is放在一起但是有一些属于不同系列的ID穿插(我在这里突出显示),我怎样才能得到排序,这样就不会混合两个ID,而且列的顺序应该是:

chr1    259017  259121  104 -   ENSG00000228463:E2
chr1    259122  267095  7973    -   ENSG00000228463:I1
chr1    267096  267253  157 -   ENSG00000228463:E1
chr1    317720  317781  61  +   ENSG00000237094:E1
chr1    317782  320161  2379    +   ENSG00000237094:I1
chr1    320162  320653  491 +   ENSG00000237094:E2
chr1    320654  320880  226 +   ENSG00000237094:I2
chr1    320881  320938  57  +   ENSG00000237094:E3
chr1    320939  321031  92  +   ENSG00000237094:I3
chr1    321032  321290  258 +   ENSG00000237094:E4
chr1    321291  322037  746 +   ENSG00000237094:I4
chr1    322038  322228  190 +   ENSG00000237094:E5
chr1    322229  322671  442 +   ENSG00000237094:I5
chr1    322672  323073  401 +   ENSG00000237094:E6
chr1    323074  323860  786 +   ENSG00000237094:I6
chr1    323861  324060  199 +   ENSG00000237094:E7
chr1    324061  324287  226 +   ENSG00000237094:I7
chr1    324288  324345  57  +   ENSG00000237094:E8
chr1    324346  324438  92  +   ENSG00000237094:I8
chr1    324439  326514  2075    +   ENSG00000237094:E9
**chr1  326096  326569  473 +   ENSG00000250575:E1**
chr1    326515  327551  1036    +   ENSG00000237094:I9
**chr1  326570  327347  777 +   ENSG00000250575:I1**
**chr1  327348  328112  764 +   ENSG00000250575:E2**
chr1    327552  328453  901 +   ENSG00000237094:E10
chr1    328454  329783  1329    +   ENSG00000237094:I10
**chr1  329431  329620  189 -   ENSG00000233653:E2**
**chr1  329621  329949  328 -   ENSG00000233653:I1**
chr1    329784  329976  192 +   ENSG00000237094:E11

2 个答案:

答案 0 :(得分:1)

原始答案:

sed 's/:[EI]/&_ /' foo.txt |  #separate the number at the end with a space
sort -k6 | sort -n -k7 |         #sort by code, then by [EI] number
sed 's/_ //'                  #remove the underscore space

我喜欢做这样的事情,用一个占位符'保护'字符串来隔离我感兴趣的东西,然后在以后替换它们。

更紧密:

sed 's/:[EI]/_ &_ /' foo.txt | sort -n -k8 | sort -k6,6 | sed 's/_ //g'

但是这天真地假设排序以非常特殊的方式运作而不是......所以有时候E2会出现在E1之前......

我不确定是否可以单独排序,awk可能是要走的路......

答案 1 :(得分:1)

所以我回到这个问题并编写了一些实际完成任务的python代码:

> df_test_3[df_test_2, roll = -Inf]
   time values
1:   15    -20
2:   20    -25
3:   26    -30
4:   28    -30
5:   31     NA

我希望你现在已经弄明白了。好奇,如果有人关心足以改善我的python。