使用Grep提取指定特征多行记录及CSV匹配需求
解决方案
需求一:提取包含指定AB(OS)字段的条目
针对以>开头、后续多行序列的文件,提取所有包含AB=EEE FFF(实际场景对应OS=Homo sapiens这类带空格的字段值)的完整条目,可使用awk命令实现:
awk -v RS='>' '/AB=EEE FFF/ {print ">"$0}' input_file.fasta
命令解释:
-v RS='>':将记录分隔符设为>,让每个条目(标题行+后续序列行)成为独立记录。/AB=EEE FFF/:筛选包含目标字段模式的记录。print ">"$0:补回记录缺失的开头>,保证输出格式与原文件一致。
实际场景中匹配OS=Homo sapiens时,只需将模式替换为/OS=Homo sapiens/即可。
需求二:提取CD(GN)字段匹配CSV列表的条目
假设CSV文件为gn_list.csv(每行一个GN值),主序列文件为input_file.fasta,可通过以下awk命令批量匹配并提取条目:
awk -v RS='>' 'NR==FNR {gn[$0]=1; next} match($0, /GN=([A-Z0-9]+)/, m) && gn[m[1]] {print ">"$0}' gn_list.csv input_file.fasta
命令解释:
- 处理CSV文件:
NR==FNR:处理第一个文件(gn_list.csv)时,将每行GN值存入数组gn标记为存在。next:跳过后续逻辑,直接读取下一行。
- 处理主序列文件:
match($0, /GN=([A-Z0-9]+)/, m):用正则提取记录中的GN值,存入数组m(m[1]为匹配到的GN值)。gn[m[1]]:检查提取的GN值是否在CSV列表的数组中。print ">"$0:符合条件则输出完整条目,补回开头的>。
注意事项:
- 若GN字段值包含下划线,可调整正则为
/GN=([A-Z0-9_]+)/。 - 若CSV存在空行,先过滤:
awk 'NF' gn_list.csv > cleaned_gn_list.csv,再用清理后的文件执行命令。
内容的提问来源于stack exchange,提问作者Joy Zheng
相关产品推荐
相关产品推荐

