对文件进行排序以将10,11,12 ...放在1,2,3 ......和X,Y之前

时间:2015-07-09 22:17:05

标签: bash sorting

我有一个带有列(染色体,起点和终点)的染色体数据列表,如下所示:

chr1    6252071 6253740
chr1    6965107 6966070
chr1    6966038 6967016
chr1    7066595 7068694
chr1    7100956 7102296
chr1    7153422 7154635
chr1    7155112 7156181
....
chr2
....
chr10
....
chrX
....
chrY
....

我正在尝试使用bash将染色体切片按此顺序排序:

chr10
chr11
chr12
chr13
chr14
chr15
chr16
chr17
chr18
chr19
chr1
chr2
chr3
chr4
chr5
chr6
chr7
chr8
chr9
chrM
chrX
chrY

在第一列中,然后按第二列中的起始位置按数字顺序排列,但sort的变化似乎没有完成。有任何想法吗?感谢。

2 个答案:

答案 0 :(得分:1)

将文件拆分为两个流,分别进行过滤,然后重新组合:

cat <(grep    '^chr1[[:digit:]][[:space:]]' <inputfile | sort) \
    <(grep -v '^chr1[[:digit:]][[:space:]]' <inputfile | sort) \
    >outputfile

答案 1 :(得分:0)

perl -E '
  open $f, "<", shift; 
  say join "", 
      map {$_->[0]}
      sort {length($b->[1]) <=> length($a->[1]) or $a->[1] cmp $b->[1]} 
      map {[$_, (split)[0]]}
      <$f>
' file

首先是open个文件。 然后它使用Schwartzian变换:从下往上读取下一个命令:

  1. 阅读以下行:<$f>
  2. 将线条转换为对列表:原始线条和第一个单词:
    map {[$_, (split)[0]}
  3. 排序,首先是长度(最长到最短),然后是词法(A到Z)
  4. 将对列表转换为行列表(对的第一个元素)
    map {$_->[0]}
  5. join(行仍然有他们的换行符,所以加入空字符串