【问题标题】:How can I make this AWK array matching unambiguous?如何使这个 AWK 数组匹配明确?
【发布时间】:2014-07-10 19:06:03
【问题描述】:

我有大型数据表(~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 匹配项。我不确定在这种情况下,数组匹配是不明确的。

【问题讨论】:

  • 发布错误的输出是可以的,但不如发布一些示例输入和预期输出有用。

标签: arrays regex awk


【解决方案1】:

您应该使用$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 非零/空的第一行开始打印(它可能位于文件的第一行)到$2 in YRI 为真的那一行(可能永远不会是这样),所以你打印整个文件。

【讨论】:

  • 嗨,Ed,我试图让问题更清楚。不幸的是,建议的更改在这种情况下没有产生任何影响。
  • 我更新了我的答案。如果这不能解决您的问题,请发布一些小的完整示例输入、预期输出和实际输出来证明问题。发布几行 10M 和 4M 文件告诉我们有问题并没有帮助。
  • 很遗憾,我不能再给你一个 +1。
  • 谢谢你,我为糟糕的表格道歉。
猜你喜欢
  • 2016-09-11
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
相关资源
最近更新 更多