繁体   English   中英

如何使用 awk 基于 2 列合并两个文件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM