最近在用Variation graph toolkit(简称vg,一款构建泛基因组,并用构建好的泛基因组来call变异的软件),想cat两个vcf文件并根据染色体号(CHROM)和起始位置(POS)进行排序,也即:
cat $vcf1 $vcf2 |sort -k 1n -k 2n >$vcf
但是结果会是X和Y在最前面,
# ...为省略内容
#CHROM POS ......
X 1979 ......
X 19469 ......
......
而我希望的顺序是1-22,然后是X和Y。
在网上查了一下,没找到sort可以用的参数,然后想用awk去做,最开始是
for i in `seq 1 22` X Y;do awk '{if($1 == '$i')print $0}' $vcf ;done >$sorted_vcf
这里有个小Tips:
要想在awk中引用for循环的变量,需要在变量$i两边加上单引号,即
# ...为省略内容
for i in ... ; do awk '...'$i'...' ;done
但是tail了一下,发现没有抓到X和Y,猜测是字符串和数字的原因。
最后用如下代码成功实现:
for i in `seq 1 22` X Y;do awk '{if($1 == "'$i'")print $0}' $vcf ;done >$sorted_vcf
注意,sort这步依然是需要做的。
如果有更好的方法,还请告诉我哦。