如何使这个AWK数组匹配明确?

时间:2014-05-21 22:40:08

标签: arrays regex awk

我有大数据表(~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匹配。我不确定在这种情况下数组匹配是多么模糊。

1 个答案:

答案 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为真的行(它可能永远不会是),所以你打印整个文件。