使用bash命令根据特定列对列表进行排序

时间:2011-10-24 16:22:02

标签: sorting

我有一个包含以下四列的数据列表:

chr1    9778939 10199603    DEL
chr1    143804138   143808614   DEL
chr1    8541961 8757598 DEL
chr1    141480516   141909199   INV
chr1    3902285 4665319 INV
chr1    10212548    10467934    DEL
chr1    225767517   226730696   INV
chr1    10807309    11011343    DEL
chr1    23663773    23957334    DEL
chr1    4468523 4665322 DEL
chr1    24458662    24704306    DEL
....
....
chr2
....
....
chr10
....
....
chr22
....
....
chrX
....
....
chrY
....
....

我希望:

  1. 首先根据chr1,chr2,chr3 .....直到chr22,chrX,chrY进行排序。如果只使用sort -n,它将排序为chr10,chr1,chr11 .... blabla。我希望根据第一栏的数值进行排序。

  2. 然后在每条染色体(chr1,chr2 ......)下如何根据最后一栏排序,即“DEL”或“INV”?

  3. 然后再次根据第二列排序数值。假设104000应该在10500之后,因为104000> 10500,但不是基于第三位数比较(4和5)

  4. 谢谢希望我已经说清楚了。

2 个答案:

答案 0 :(得分:2)

假设文件afile中的列由单个space字符分隔

$ cat afile | sed 's/chr/chr /' | sort -k2,2n -k5,5 -k3,3n | sed 's/chr /chr/'

答案 1 :(得分:0)

将X和Y转换为23和24以数字排序,然后在排序后返回。

cat file | sed 's/chr/chr /' | sed 's/ X/ 23/' | sed 's/ Y/ 24/' | sort -k 2,2n -k 5,5n -k 3,3n | sed 's/chr 23/chrX/' | sed 's/chr 24/chrY/' | sed 's/chr /chr/'

这是一长串seds,但它们运行得很快。