我有一个包含以下四列的数据列表:
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
....
....
我希望:
首先根据chr1,chr2,chr3 .....直到chr22,chrX,chrY进行排序。如果只使用sort -n
,它将排序为chr10,chr1,chr11 .... blabla。我希望根据第一栏的数值进行排序。
然后在每条染色体(chr1,chr2 ......)下如何根据最后一栏排序,即“DEL”或“INV”?
然后再次根据第二列排序数值。假设104000应该在10500之后,因为104000> 10500,但不是基于第三位数比较(4和5)
谢谢希望我已经说清楚了。
答案 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,但它们运行得很快。