专栏名称: 生信媛
生信媛,从1人分享,到8人同行。坚持分享生信入门方法与课程,持续记录生信相关的分析pipeline, python和R在生物信息学中的利用。内容涵盖服务器使用、基因组转录组分析以及群体遗传。
目录
相关文章推荐
51好读  ›  专栏  ›  生信媛

一个使用windows系统的生信人必走的坑·文件格式

生信媛  · 公众号  · 生物  · 2019-09-28 08:00

正文

请到「今天看啥」查看全文



最近在合并文件的时候,遇到一个诡异的问题。以下边数据为例:

想以第一列基因名称为key,将文件Batata N215-01-T01 good.count和Batata N215-01-T02 good.count 第二列的基因表达量合成一个表达量矩阵。

先来看一眼数据的样子:

  1. $ head Batata_N215-01-T01_good.count

  2. G1 1123

  3. G10 46

  4. G100 99

  5. G1000 290

  6. G10000 464

  7. G10001 608

  8. G10002 10

  9. G10003 2629

  10. G10004 6

  11. G10005 0

  12. $ head Batata_N215-01-T02_good.count

  13. G1 831

  14. G10 34

  15. G100 95

  16. G1000 236

  17. G10000 381

  18. G10001 557

  19. G10002 4

  20. G10003 2602

  21. G10004 12

  22. G10005 0

当我用awk进行合并,发现两列数据以极其诡异的形式合在一起。

  1. $ awk -F '\t' 'ARGIND==1{a[$1]=$0}ARGIND==2{print a[$1]"\t"$2}' Batata_N215-01-T01_good.count Batata_N215-01-T02_good.count|head

  2. G1 8313

  3. G10346

  4. G1095 99

  5. G10236 290

  6. G10381 464

  7. G10557 608

  8. G10402 10

  9. G102602 2629

  10. G10124 6

  11. G10005 0

为了确保不是命令的问题。我又找来另一组数据SRR6354710 2M.htseq.count.txt 和SRR6354711 2M.htseq.count.txt 同样进行合并。数据如下:

  1. $ head SRR6354710_2M.htseq.count.txt

  2. ENSG00000000003 0

  3. ENSG00000000005 0

  4. ENSG00000000419 188

  5. ENSG00000000457 38

  6. ENSG00000000460 50

  7. ENSG00000000938 2521

  8. ENSG00000000971 0

  9. ENSG00000001036 249

  10. ENSG00000001084 160

  11. ENSG00000001167 162

  12. $ head SRR6354711_2M.htseq.count.txt

  13. ENSG00000000003 0

  14. ENSG00000000005 0

  15. ENSG00000000419 158

  16. ENSG00000000457 40

  17. ENSG00000000460 47

  18. ENSG00000000938 2315

  19. ENSG00000000971 0

  20. ENSG00000001036 238

  21. ENSG00000001084 183

  22. ENSG00000001167 154

看起来一切正常.

  1. $ awk -F '\t' 'ARGIND==1{a[$1]=$0}ARGIND==2{print a[$1]"\t"$2}' SRR6354710_2M.htseq.count.txt SRR6354711_2M.htseq.count.txt|head

  2. ENSG00000000003 0 0

  3. ENSG00000000005 0 0

  4. ENSG00000000419 188 158

  5. ENSG00000000457 38 40

  6. ENSG00000000460 50 47

  7. ENSG00000000938 2521 2315

  8. ENSG00000000971 0 0

  9. ENSG00000001036 249 238

  10. ENSG00000001084 160 183

  11. ENSG00000001167 162 154

不死心的我,把命令换成下边的。当然,一样的结局。

  1. awk -'\t' 'NR==FNR{a[$1]=$0;next}NR>FNR{if($1 in a)print a[$1]"\t"$2}' Batata_N215-01-T01_good.count Batata_N215-01-T02_good.count|head

于是跑到小编群去求助大家。小编靠谱熊用我的数据测试了一下,很快给了我回复。是文件格式的问题。

得到真传,赶紧测试一下。果然dos2unix一下,一切正常了。

  1. dos2unix *

  2. $ awk -F '\t' 'ARGIND==1{a[$1]=$0}ARGIND==2{print a[$1]"\t"$2}' Batata_N215-01-T01_good.count Batata_N215-01-T02_good.count|head

  3. G1 1123 831

  4. G10 46 34

  5. G100 99 95

  6. G1000 290 236

  7. G10000 464 381

  8. G10001 608 557

  9. G10002 10 4

  10. G10003 2629 2602

  11. G10004 6 12

  12. G10005 0 0

使用cat -A查看一下隐藏的字符。

dos2unix之前:

  1. $ cat -A Batata_N215-01-T01_good.count |head

  2. G1^I1123^M$

  3. G10^I46^M$

  4. G100^I99^M$

  5. G1000^I290^M$

  6. G10000^I464^M$

  7. G10001^I608^M$

  8. G10002 ^I10^M$

  9. G10003^I2629^M$

  10. G10004^I6^M$

  11. G10005^I0^M$

dos2unix之后

  1. 2$ cat -A Batata_N215-01-T01_good.count |head

  2. G1^I1123$

  3. G10^I46$

  4. G100^I99$

  5. G1000^I290$

  6. G10000^I464$

  7. G10001^I608$

  8. G10002^I10$

  9. G10003^I2629$

  10. G10004^I6$

  11. G10005^ I0$

当然,另一个小编也提出来,不用dos2unix,也可以。

  1. sed -i 's/\r$//' 需要转换的文件名

真是太坑了。我的数据只是从linux服务器拷贝到windows下,再拷贝到linux服务器。路过而已,路过而已,路过而已。

最后,借用更更的话送给大家。

最后的最后,附送dos2unix的安装方法,常备常安心。

下载dos2unix

  1. curl -L https://sourceforge.net/projects/dos2unix/files/dos2unix/7.4.1/dos2unix-7.4.1.tar.gz/download -O


  2. mv download dos2unix.tar.gz


  3. # 或者

  4. # git clone git://git.code.sf.net/p/dos2unix/dos2unix

安装

  1. tar -zxvf dos2unix.tar.gz

  2. cd dos2unix-7.4.1/

  3. make

  4. # 指定安装路径

  5. make DESTDIR=/×××/×××/ install

  6. echo 'export PATH=/×××/×××/usr/bin:$PATH' >> ~/.bashrc

  7. source ~/.bashrc

  8. dos2unix -h

  9. # OK








请到「今天看啥」查看全文