一、待解決問題
科室里的一個小伙伴打算根據A文件中的ID列,提取B文件中所有包含相應ID的行。
- A文件如下所示。tip:ID列指的是圖中帶紅框的那列,A大小73.1MB、B大小約1GB
image.png - B文件是從網上下載的注釋文件"GCF_000001405.38_GRCh38.p12_genomic.gff"
二、解決辦法
左思右想覺得這個處理過程還是用linux來做比較簡單。
- 用excel手動刪除A多余列只保留第二列中的ID值,保存為ref.txt
- 書寫linux代碼進行提取
#!/bin/bash
cat -A ref.txt | while read id;
do
real_id=`echo $id| cut -d"^" -f1`
grep $real_id GCF_000001405.38_GRCh38.p12_genomic.gff >>ref.gff
done
三、解析
- cat用法就不贅述了,光是簡書上就有很多,我直接掛簡書幾個鏈接:
1.everyday:linux cat
2.linux cat
3.情景linux—不曾了解的cat用法 - while用法
1.Linux shell之while循環
2.Linux while 循環中使用ssh問題 - grep用法
1.linux grep命令
2.Linux常用指令---grep(搜索過濾)(轉)
3.Linux文件比較三劍客(awk/grep/sed)之grep
四、代碼思路
cat
提取整個文件內容;用|
管道符號傳給 while read
讀取,
由于window下的回車符號與Linux下的回車不一樣:window下的回車到了linux下會多出^M
,所以在代碼中用cut -d"^"
分割文件,并取第一部分作為ID。最后使用grep 搜索ID 然后>>
輸出到ref.gff文件去
五、簡便方法:
grep -f -w file1 file2
file1是我們的id,file2是我們待檢索的文件。上方代碼功能是直接提取file2中包含Id的行。