[英]How to merge two files based on 2 columns using awk?
我有两个具有不同行号的文件。 我想将 file1 与 file2 合并,类似于我在 R 中使用 left_join 的方式:
Denisovan_EAS_4 <- left_join(file1,file2,by = "SNP", "pval")%>% distinct(SNP, pval, .keep_all = TRUE)
我想使用 awk,因为它更快、更高效。
文件 1:
SNP pval
rs9258594 1.52e-127
rs62056091 9.97e-95
文件 2:
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
rs7680377 2 5687902 -1.136 0.5357 1.18e-34 T C 0.15 Neurological NA NA NA NA 0.21 0.25
所有 SNP 都存在于文件 1 中的文件 2 中,文件 1 的行数比文件 2 少得多。我想在文件 3 中打印文件 2 的所有标题。
文件 3(与文件 2 相同,但只有文件 1 中存在 pval 的 SNP):
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 10 122943300 -1.466 0.5799 9.97e-95 C A 0.35 Neurological NA NA NA NA 0.75 0.0045
好的,您说“只有文件 1) 中存在的具有 pval 的 SNP” ,看来 file1 中的存在足以确定某些东西具有 pval,是吗? 因此,以下内容可能就足够了:
$ awk 'NR==FNR{f1[$1];next} $1 in f1' file1 file2
这会读取两个文件。 在第一个文件中,您使用键填充数组,在第二个文件中,您仅打印具有现有键的行。
请注意,如果您想要一个更复杂的条件,仅检查是否存在 - 例如, file1 的 pval 列匹配某个模式,很容易添加:
'NR==FNR && $2 ~ /^[0-9]+\.[0-9]+e-?[0-9.]+$/ {f1[$1; next}`
另请注意, $1 in f1
是检查数组中是否存在键的完整条件。 在 awk 中,如果条件没有语句,则语句默认为{print}
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.