事情是这个样子的:
今天,我像往常一样提取基因组的样本,我有一堆样本的ID,需要从所有的基因型的文件中提取出来。
以前我都是使用R语言,将基因型数据读进去,将所要提取的ID文件读进去,然后,我就有很多方法提取了 ,比如用match匹配位置,然后提取写出。比如用merge或者left_join提取写出。比如用%in%提取写出。
我有很多方法处理它,但是我今天想用
grep函数,因为我知道grep -f file1 file2可以根据file1的内容提取筛选file2.
为什么我今天不用R语言处理了呢?
因为今天的基因型数据有点大,有90G,这个数据读到R中只为了筛选其中的几十行数据,不地道呀,太不地道了,虽然我们的服务器内存大,但是不是这样玩的,同事会投诉我滥用计算机资源的,我没有挖矿,为何用这么多资源?还不是编程水平差吗!想到这里,我流下了不学无术的眼泪。
于是,我就开始准备文件,需要提取的样本编号是这样的:
[dengfei@localhost test]$ cat id1.txt
Sample_ID
202797280021_R04C03
202817020006_R03C01
202817020006_R10C03
202817020009_R02C02
202817020009_R20C01
202817170002_R07C02
202817170002_R11C01
202817170002_R11C03
202817170002_R13C03
原始的基因型数据,第一列是这样的,剩余的列都是进行数据,有1000多万位点。
说时迟那时快,我直接写下代码,是时候展示真正的实力了:
[dengfei@localhost test]$ grep -f id1.txt total.txt >re_id1.txt
[dengfei@localhost test]$ wc -l re_id1.txt
0
什么都没有!这不科学,我应该能提取出来的,应该都在文件中的,于是我用其中的一个基因型ID测试:
[dengfei@localhost test]$ grep 202817020006_R10C03 total.txt
202817020006_R10C03
匹配出来了!
单个样本可以匹配出来,多个样本无法匹配出来,这是什么原因,我不仅陷入了沉思……
于是我开始了baidu,bing,google,查遍全网,也没有找到原因。
没有找到原因,我就模拟一个数据,自己测试一下吧,看看grep -f file1 file2是不是如我理解的那样:
(base) [dfei@bogon ~]$ cat file1
2
4
e
(base) [dfei@bogon ~]$ cat file2
a1
b2
c3
d4
e5
如上所述,我模拟了两个文件,一个是另一个的子集,匹配结果如下:
(base) [dfei@bogon ~]$ grep -f file1 file2
b2
d4
e5
可以看到,例子是没问题的,grep -f用起来是666的。为何我实际分析时会报错呢?我继续全网搜索。
我看了grep的参数,有一个-F的参数,可以忽略正则表达式字符,直接用原始字符进行匹配,类似R中的fixed =T,我好像发现了新大陆,迫不及待试了一下:
[dengfei@localhost test]$ grep -F -f id1.txt total.txt >re_id1.txt
[dengfei@localhost test]$ wc -l re_id1.txt
0
没有变化。
……漫长的分割线……
问题解决
原因是:windows和Linux换行符不一样所致。
cat -A name.txt
Sample_ID^M$
202797280021_R04C03^M$
202817020006_R03C01^M$
202817020006_R10C03^M$
202817020009_R02C02^M$
202817020009_R20C01^M$
202817170002_R07C02^M$
202817170002_R11C01^M$
202817170002_R11C03^M$
用dos2unix处理一下,就搞定了。
dos2unix name.txt