两文件指定列匹配后修改file1第4列为pseudogene的实现方法
实现方案
方案说明
你需要的功能可以通过awk命令直接完成,awk天然支持结构化文本的字段读取、修改操作,比单纯用grep筛选后再拼接处理效率高很多。
精确匹配引号内基因名(推荐)
该方案会精准提取file1第13列引号内的基因名,和file2的内容做精确匹配,匹配成功则修改第4列为pseudogene,不会改动原行其他内容:
awk 'NR==FNR { gene_list[$0] = 1 next } { sym = $13 gsub(/^"|"[;]*$/, "", sym) if (sym in gene_list) { $4 = "pseudogene" } print }' file2 file1 > output_file
如果你的file1是制表符分隔,需要保留原制表符格式,可以加上分隔符参数:
awk -F'\t' -v OFS='\t' 'NR==FNR {gene_list[$0]=1; next} {sym=$13; gsub(/^"|"[;]*$/, "", sym); if(sym in gene_list) $4="pseudogene"} 1' file2 file1 > output_file
部分匹配第13列内容
如果你确实需要只要file2的内容是第13列的子串就算匹配,可以用以下版本:
awk 'NR==FNR { gene_list[++count] = $0 next } { for(i=1; i<=count; i++) { if(index($13, gene_list[i]) > 0) { $4 = "pseudogene" break } } print }' file2 file1 > output_file
参数说明
NR==FNR:判断当前是否在处理第一个输入文件(即file2),将所有基因名存入数组sym = $13:把第13列内容赋值给临时变量,避免修改原列的原有格式gsub(/^"|"[;]*$/, "", sym):去除提取内容首尾的双引号和末尾分号,得到纯基因名- 末尾的
1是awk简写语法,等价于打印所有处理后的行 - 结果会输出到
output_file中,不会修改原文件
内容的提问来源于stack exchange,提问作者Amaranta_Remedios
相关产品推荐
相关产品推荐

