一、待解决问题
科室里的一个小伙伴打算根据A文件中的ID列,提取B文件中所有包含相应ID的行。
- A文件如下所示。tip:ID列指的是图中带红框的那列,A大小73.1MB、B大小约1GB
- 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的行。