關(guān)于Linux的grep -f命令,我以為我發(fā)現(xiàn)了bug #2021.8.5前天的送書活動(留言送書 | 《統(tǒng)計之美》--體會統(tǒng)計的魅力)結(jié)果出來了,5位中獎人員,快來聯(lián)系我吧: 開始我的魔幻的一天: ? 事情是這個樣子的: 今天,我像往常一樣提取基因組的樣本,我有一堆樣本的ID,需要從所有的基因型的文件中提取出來。 以前我都是使用R語言,將基因型數(shù)據(jù)讀進(jìn)去,將所要提取的ID文件讀進(jìn)去,然后,我就有很多方法提取了 ,比如用 ? 為什么我今天不用R語言處理了呢? ? 于是,我就開始準(zhǔn)備文件,需要提取的樣本編號是這樣的: $ cat id1.txt 原始的基因型數(shù)據(jù),第一列是這樣的,剩余的列都是進(jìn)行數(shù)據(jù),有1000多萬位點(diǎn)。 說時遲那時快,我直接寫下代碼,是時候展示真正的實(shí)力了: $ grep -f id1.txt total.txt >re_id1.txt 什么都沒有!這不科學(xué),我應(yīng)該能提取出來的,應(yīng)該都在文件中的,于是我用其中的一個基因型ID測試: $ grep 202817020006_R10C03 total.txt 匹配出來了! 單個樣本可以匹配出來,多個樣本無法匹配出來,這是什么原因,我不僅陷入了沉思…… 于是我開始了baidu,bing,google,查遍全網(wǎng),也沒有找到原因。 沒有找到原因,我就模擬一個數(shù)據(jù),自己測試一下吧,看看 (base) [dfei@bogon ~]$ cat file1 如上所述,我模擬了兩個文件,一個是另一個的子集,匹配結(jié)果如下: (base) [dfei@bogon ~]$ grep -f file1 file2 可以看到,例子是沒問題的, 我看了grep的參數(shù),有一個 [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 然后再運(yùn)行: 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,查找當(dāng)前文件夾的所有文件,包括所有子文件中的文件grep -r phenoix * 6,反向顯示 -v,顯示不匹配的行grep -v phenoix * 7,打印所有匹配的行,要全部匹配,而不是包含關(guān)系 -xgrep -x phenoix * 這里,只打印 phenoix的行,aphenoix是不打印的,因為不是完全匹配 8,僅顯示匹配的文件名稱,而不是所在的行 -lgrep -l phenoix * 9,顯示匹配的個數(shù) -c,類似uniq -cgrep -c phenoix * 10,顯示匹配所在的行號,類似cat -ngrep -n phenoix * 11,匹配單詞,而不是所有包含的行 -wgrep -w phenoix * 12,將匹配模式放到文件中 -fgrep -f file1 file2 會匹配file2中所有包括file1的行。注意:
|
|