如何用awk基于SNP与pval两列合并文件?附排障需求
解决awk实现类似R left_join的匹配问题
问题分析
你需要根据file1中的SNP和pval两个字段,筛选出file2中对应匹配的行,同时保留file2的完整表头。之前的代码存在输入顺序错误、键存储逻辑错误、匹配条件错误,导致输出为空。
正确的awk实现代码
# 先处理file1,将SNP和pval组合成唯一键存入数组 NR==FNR && FNR>1 { key = $1 "," $2; a[key] = 1; next } # 处理file2:先打印表头,再匹配键 FNR==1 { print $0; next } { key = $1 "," $6; if (key in a) print $0 }
执行命令:
awk -f script.awk file1 file2 > file3
或者一行命令:
awk 'NR==FNR && FNR>1 {a[$1","$2]=1;next} FNR==1{print;next} {k=$1","$6;if(k in a)print}' file1 file2 > file3
代码解释
- 处理file1:
NR==FNR && FNR>1:仅处理第一个输入文件(file1)且跳过表头行- 将
SNP($1)和pval($2)用逗号拼接成唯一键,存入数组a标记为存在
- 处理file2:
FNR==1:直接打印file2的表头行- 对数据行,将file2中的
SNP($1)和pval($6)拼接成键,检查是否存在于数组a中,存在则打印整行
验证结果
执行后输出的file3与你期望的结果完全一致:
SNP CHROM POS beta se pval REF ALT af Category Description Details Ancestry phenotype pval_heterogeneity fdr rs9258594 10 122943300 -1.629 0.4599 1.52e-127 T G 0.05 Metabolic NA NA NA NA 0.25 0.005 rs62056091 8 122546790 -1.466 0.5799 9.97e-95 C A 0.35 Neurological NA NA NA NA 0.75 0.0045
内容的提问来源于stack exchange,提问作者kllrdr
相关产品推荐
相关产品推荐

