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

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

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

正文

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


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

想以第一列基因名称为key,将文件Batata_N215-01-T01_good.count和Batata_N215-01-T02_good.count 第二列的基因表达量合成一个表达量矩阵。

先来看一眼数据的样子:

$ head Batata_N215-01-T01_good.count
G1 1123G10 46G100 99G1000 290G10000 464G10001 608G10002 10G10003 2629G10004 6G10005 0$ head Batata_N215-01-T02_good.count
G1 831G10 34G100 95G1000 236G10000 381G10001 557G10002 4G10003 2602G10004 12G10005 0

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

$ 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
G1 8313G10346
G1095 99G10236 290G10381 464G10557 608G10402 10G102602 2629G10124 6G10005 0

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

$ head SRR6354710_2M.htseq.count.txt
ENSG00000000003 0ENSG00000000005 0ENSG00000000419 188ENSG00000000457 38ENSG00000000460 50ENSG00000000938 2521ENSG00000000971 0ENSG00000001036 249ENSG00000001084 160ENSG00000001167 162$ head SRR6354711_2M.htseq.count.txt
ENSG00000000003 0ENSG00000000005 0ENSG00000000419 158ENSG00000000457 40ENSG00000000460 47ENSG00000000938 2315ENSG00000000971 0ENSG00000001036 238ENSG00000001084 183ENSG00000001167 154

看起来一切正常.

$ 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
ENSG00000000003 0 0ENSG00000000005 0 0ENSG00000000419 188 158ENSG00000000457 38 40ENSG00000000460 50 47ENSG00000000938 2521 2315ENSG00000000971 0 0ENSG00000001036 249 238ENSG00000001084 160 183ENSG00000001167 162 154

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

awk -F '\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一下,一切正常了。

dos2unix *
$ 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
G1 1123 831G10 46 34G100 99 95G1000 290 236G10000 464 381G10001 608 557G10002 10 4G10003 2629 2602G10004 6 12G10005 0 0

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

dos2unix之前:

$ cat -A Batata_N215-01-T01_good.count |head
G1^I1123^M$
G10^I46^M$
G100^I99^M$
G1000^I290^M$
G10000^I464^M$
G10001^I608^M$
G10002^I10^M$
G10003^I2629^M$
G10004^I6^M$
G10005^I0^M$

dos2unix之后

2$ cat -A Batata_N215-01-T01_good.count |head
G1^I1123$
G10^I46$
G100^I99$
G1000^I290$
G10000^I464$
G10001^I608$
G10002^I10$
G10003^I2629$
G10004^I6$
G10005^I0$

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

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

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

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


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

下载dos2unix

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

mv download dos2unix.tar.gz# 或者# git clone git://git.code.sf.net/p/dos2unix/dos2unix

安装

tar -zxvf dos2unix.tar.gzcd dos2unix-7.4.1/
make# 指定安装路径make DESTDIR=/×××/×××/ installecho 'export PATH=/×××/×××/usr/bin:$PATH' >> ~/.bashrcsource ~/.bashrc
dos2unix -h# OK






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