关于Linux的grep -f命令,我以为我发现了bug #2021.8.5前天的送书活动(留言送书 | 《统计之美》--体会统计的魅力)结果出来了,5位中奖人员,快来联系我吧: 开始我的魔幻的一天: ❝ 事情是这个样子的: 今天,我像往常一样提取基因组的样本,我有一堆样本的ID,需要从所有的基因型的文件中提取出来。 以前我都是使用R语言,将基因型数据读进去,将所要提取的ID文件读进去,然后,我就有很多方法提取了 ,比如用 ❝ 为什么我今天不用R语言处理了呢? ❝ 于是,我就开始准备文件,需要提取的样本编号是这样的: $ cat id1.txt 原始的基因型数据,第一列是这样的,剩余的列都是进行数据,有1000多万位点。 说时迟那时快,我直接写下代码,是时候展示真正的实力了: $ grep -f id1.txt total.txt >re_id1.txt 什么都没有!这不科学,我应该能提取出来的,应该都在文件中的,于是我用其中的一个基因型ID测试: $ grep 202817020006_R10C03 total.txt 匹配出来了! 单个样本可以匹配出来,多个样本无法匹配出来,这是什么原因,我不仅陷入了沉思…… 于是我开始了baidu,bing,google,查遍全网,也没有找到原因。 没有找到原因,我就模拟一个数据,自己测试一下吧,看看 (base) [dfei@bogon ~]$ cat file1 如上所述,我模拟了两个文件,一个是另一个的子集,匹配结果如下: (base) [dfei@bogon ~]$ grep -f file1 file2 可以看到,例子是没问题的, 我看了grep的参数,有一个 [dengfei@localhost test]$ grep -F -f id1.txt total.txt >re_id1.txt 没有变化。 ……漫长的分割线…… 问题解决原因是:windows和Linux换行符不一样所致。 cat -A name.txt Sample_ID^M$ 可以看到,我的文件每一行的分隔符是 「代码解决:」 dos2unix name.txt 然后再运行: grep -f id1.txt total.txt >re_id1.txt 就匹配成功了。 那就顺便整理一下grep的用法吧基本用法: grep name list name: 为需要匹配的字符 list:为文件 1,直接查找grep phoenix sample2 直接在sample2文件中,显示有phenoix的行 2,查找多个文件grep phoenix sample1 sample2 sample3 在sample1,sample2,sample3三个文件中查找匹配到phoenix的行,并显示 3,查找所有文件(支持通配符)grep phenoix sample* 4,忽略大小写 -igrep -i phenoix * 5,递归查找,-r,查找当前文件夹的所有文件,包括所有子文件中的文件grep -r phenoix * 6,反向显示 -v,显示不匹配的行grep -v phenoix * 7,打印所有匹配的行,要全部匹配,而不是包含关系 -xgrep -x phenoix * 这里,只打印 phenoix的行,aphenoix是不打印的,因为不是完全匹配 8,仅显示匹配的文件名称,而不是所在的行 -lgrep -l phenoix * 9,显示匹配的个数 -c,类似uniq -cgrep -c phenoix * 10,显示匹配所在的行号,类似cat -ngrep -n phenoix * 11,匹配单词,而不是所有包含的行 -wgrep -w phenoix * 12,将匹配模式放到文件中 -fgrep -f file1 file2 会匹配file2中所有包括file1的行。注意:
|
|