Arrays 如何使此AWK数组匹配明确?

Arrays 如何使此AWK数组匹配明确?,arrays,regex,awk,Arrays,Regex,Awk,我有大数据表(~10M行和~4M行),我想在[$1,$2]上进行数组匹配。这两个字段都是数字字段,如本例所示,从4M文件1的开头开始,然后是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.fr

我有大数据表(~10M行和~4M行),我想在
[$1,$2]
上进行数组匹配。这两个字段都是数字字段,如本例所示,从4M文件1的开头开始,然后是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似乎会进行不明确的匹配。当我使用以下命令时,将返回文件2的所有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,$2
,而不是
$1$2
,作为数组索引

您使用YRI中的
$1,$2
作为条件。在YRI中将其更改为
($1,$2)

x,y
是一种语法,用于指定在为true时打印的一系列条件(通常为
/start/,/end/
),而
(x,y)
是一种语法,用于创建数组索引以与
中的
运算符一起使用


当您在YRI中写入
$1、$2
时,您正在写入
($1),($2 in YRI)
,它告诉awk从
$1
非零/空的第一行(它可能位于文件的第一行)开始打印到
$2 in YRI
为真的那一行(它可能永远不会为真)因此,您可以打印整个文件。

您应该使用
$1,$2
,而不是
$1$2
,作为数组索引

您使用YRI中的
$1,$2
作为条件。在YRI中将其更改为
($1,$2)

x,y
是一种语法,用于指定在为true时打印的一系列条件(通常为
/start/,/end/
),而
(x,y)
是一种语法,用于创建数组索引以与
中的
运算符一起使用


当您在YRI中写入
$1、$2
时,您正在写入
($1),($2 in YRI)
,它告诉awk从
$1
非零/空的第一行(它可能位于文件的第一行)开始打印到
$2 in YRI
为真的那一行(它可能永远不会为真)因此,您可以打印整个文件。

发布错误的输出是可以的,但不如发布一些示例输入和预期输出有用。发布错误的输出是可以的,但不如发布一些示例输入和预期输出有用。嗨,Ed,我试图将问题弄清楚。不幸的是,在这种情况下,建议的更改并没有产生任何影响。我更新了我的答案。如果这不能解决您的问题,那么请发布一些完整的小样本输入、预期输出和实际输出来演示问题。发布几行1000万和400万的文件告诉我们有问题,这没有帮助。遗憾的是,我不能给你一秒钟+1。谢谢你,我为糟糕的表格道歉。嗨,Ed,我试图把问题说得更清楚。不幸的是,在这种情况下,建议的更改并没有产生任何影响。我更新了我的答案。如果这不能解决您的问题,那么请发布一些完整的小样本输入、预期输出和实际输出来演示问题。发布几行1000万和400万的文件告诉我们出现了问题,这对我们没有帮助。遗憾的是,我不能给你第二个+1。谢谢你,我为糟糕的表格道歉。