1

我有我认为应该是一个常见问题,但我还没有找到任何好的解决方案。

我有一个文件,其中每一行都有一个染色体编号、染色体中的起始位置和一些相关值,如下所示。

1       1.07299851019   1       1.07299851019   HQ      chrY    2845223         +       0.251366120219  46      
1       1.06860686763   1       1.06860686763   HQ      chr10   88595309        +       0.256830601093  47      
1       1.04688316093   3       3.14064948278   HQ      chr6    49126474        +       0.295081967213  54      
1       1.1563829915    1       1.1563829915    HQ      chrX    16428176        +       0.185792349727  34      

我想在染色体(第 6 列)和起始位置(第 7 列)上使用 unix 排序命令对这个文件进行排序。在四处寻找之后,我想出了这个,这让我非常接近:

nohup sort -t $'\t' -k 6.4,6.5n -k 7,7n   

我无法解决的剩下的问题是,虽然用数字编号的染色体可以正常排序,但 X 和 Y 染色体在起始位置上被排序在一起,如下所示:

1       0.978579587641  9       8.80721628876   HQ      chrX    2861057 -       0.431693989071  79      
1       0.979500536702  1       0.979500536702  HQ      chrY    2861314 -       0.420765027322  77      
1       0.969979601694  9       8.72981641525   HQ      chrX    2861649 -       0.469945355191  86   

我知道可以通过用数字替换 chrX 和 chrY 来解决,或者编写一个程序来解决它,但是能够使用一个简单的命令会非常好,特别是因为文件大小通常很大而且我反复这样做。

如果染色体按 1 到 22 的顺序排列,然后是 X 和 Y。我的命令首先是 X 和 Y 染色体,然后是 1 到 22 号染色体。

4

3 回答 3

2

要与 分开XY您可以指定一个备用键:

nohup sort -t $'\t' -k 6.4,6.5n -k 6 -k 7,7n

(这表示如果字段中的两行在6.4,6.5数字上比较是等效的,那么下一步是在尝试之前在字段中以6 7数字方式比较它们 field )。

免责声明:这不满足您最后一段中的目标:

如果染色体按 1 到 22 的顺序排列,然后是 X 和 Y。我的命令首先是 X 和 Y 染色体,然后是 1 到 22 号染色体。

因为XandY在数字排序期间仍将被视为零,并且后备不会改变这一点。无论如何,希望您发现它很有用。

我知道可以通过用数字替换 chrX 和 chrY 来解决,[…]

实际上,您可以即时进行替换:

sed 's/chrX/chr23/; s/chrY/chr24/' |
  sort -t $'\t' -k 6.4,6.5n -k 7,7n |
  sed 's/chr23/chrX/; s/chr24/chrY/'

(请注意,此命令中的换行符是可选的;我将它们包括在内是为了便于阅读,但如果您愿意,如果/当您实际使用它时,您可以将其放在一行中。)

于 2013-07-06T18:25:37.593 回答
2

如果您的版本sort支持-V用于对字母数字列进行排序的选项,那么您可以执行以下操作:

$ cat file
1   1.07299851019   1   1.07299851019   HQ  chrY    2845223     +   0.251366120219  46
1   1.06860686763   1   1.06860686763   HQ  chr10   88595309    +   0.256830601093  47
1   1.04688316093   3   3.14064948278   HQ  chr6    49126474    +   0.295081967213  54
1   1.1563829915    1   1.1563829915    HQ  chrX    16428176    +   0.185792349727  34

$ sort -t$'\t' -k6V -k7n file
1   1.04688316093   3   3.14064948278   HQ  chr6    49126474    +   0.295081967213  54
1   1.06860686763   1   1.06860686763   HQ  chr10   88595309    +   0.256830601093  47
1   1.1563829915    1   1.1563829915    HQ  chrX    16428176    +   0.185792349727  34
1   1.07299851019   1   1.07299851019   HQ  chrY    2845223     +   0.251366120219  46
于 2013-07-06T18:35:04.153 回答
0

详细说明 jaypal 之前的回答......

您可以像这样更改每列的排序条件:

sort -k1,1V input.txt

这将使用上述-V选项对第 1 列且仅第 1 列进行排序,该选项如下引用自此处

-V 的意思是“文本中自然排序的(版本)数字”(输入 man sort 查找),它神奇地对数字和文本进行排序。

如果您在制表符分隔的文件中有多个列,并且您想要指定主列排序顺序,您可以执行以下操作:

sort -k14,14V -k1,1n input.txt

上面将使用第 14 列作为第一个排序索引并应用-V排序算法,然后将使用第 1 列作为二级排序索引并使用数字排序。(这在某些圈子中可能对按染色体排序然后位置很有用)。

要解决 OSX 用户缺少的-V选项:

Mac OS X 原生排序不支持 -V,您必须安装 GNU 核心实用程序并改用 gsort。

要快速了解-V排序的工作原理,您可以查看以下示例...

示例输入:

chr21   
chr2    
chr3    
chrY    
chr1    
chr3    
chr10   
chrX    

V 排序输出:

chr1    
chr2    
chr3    
chr3    
chr10   
chr21   
chrX    
chrY    
于 2019-01-24T22:34:02.717 回答