我有大数据表(~10M行和~4M行),我希望在[$1,$2]
上匹配数组。这两个字段都只是数字,如本例所示,从4M file1的头部开始,后跟10M行文件2的头部:
$ head -5 pantro2-hg19-liftover.frq
1 868476 A:0.388889
1 868841 A:0.666667
1 873398 A:0.555556
1 879624 A:0.05
1 879821 A:0.0625
$ head -5 tot_YRI10.frq
CHROM POS N_ALLELES N_CHR {ALLELE:FREQ}
1 30923 2 20 T:0.35 G:0.65
1 52238 2 20 G:0.55 T:0.45
1 54676 2 20 T:0.05 C:0.95
1 55164 2 20 A:0.55 C:0.45
不幸的是,如果[$1,$2]
的一部分与文件2中的$1,$2
匹配,AWK似乎会产生模糊匹配。当我使用以下命令时,将返回fileM的所有10M行:
$ awk 'NR==FNR{YRI[$1,$2];next} $1,$2 in YRI {print $1,$2,$NF}'
pantro2-hg19-liftover.frq tot_YRI10.frq |
head -5
CHROM POS {ALLELE:FREQ}
1 30923 G:0.65
1 52238 T:0.45
1 54676 C:0.95
1 55164 C:0.45
我想要的输出是与第1列和第2列上的file1匹配的file2行。那里应该只有大约15K匹配。我不确定在这种情况下数组匹配是多么模糊。
答案 0 :(得分:4)
您应该使用$1,$2
,而不是$1$2
作为数组索引。
您使用$1,$2 in YRI
作为条件。将其更改为($1,$2) in YRI
。
x,y
是指定要在true时(通常是/start/,/end/
之类的语句)之间打印的条件范围的语法,而(x,y)
是用于创建与之一起使用的数组索引的语法in
运营商。
当您编写$1,$2 in YRI
时,您正在编写($1),($2 in YRI)
,它告诉awk从第一行开始打印$1
非零/ null(可能是第一行)您的文件的行)到$2 in YRI
为真的行(它可能永远不会是),所以你打印整个文件。