如何在正则表达式中使用awk变量?

Han*_*ncy 25 regex awk

我有一个名为domain的文件,其中包含一些域名.例如:

google.com
facebook.com
...
yahoo.com
Run Code Online (Sandbox Code Playgroud)

我有另一个名为site的文件,其中包含一些网站的URL和数字.例如:

image.google.com   10
map.google.com     8
...
photo.facebook.com  22
game.facebook.com   15
..
Run Code Online (Sandbox Code Playgroud)

现在我要计算每个域名的网址号.例如:google.com10 + 8.所以我写了一个像这样的awk脚本:

BEGIN{
  while(getline dom < "./domain" > 0) {
    domain[dom]=0;
  }
  for(dom in domain) {
    while(getline < "./site" > 0) {
      if($1 ~/$dom$)   #if $1 end with $dom {
        domain[dom]+=$2;
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但代码if($1 ~/$dom$)并不像我想的那样运行.因为正则表达式中的变量$ dom是按字面解释的.所以,第一个问题是:

有没有办法$dom在正则表达式中使用变量?

然后,因为我刚开始编写脚本

有没有更好的方法来解决我的问题?

Mat*_*att 33

awk如果不使用//正则表达式标记,则可以匹配变量.

if ( $0 ~ regex ){ print $0; }

在这种情况下,将所需的正则表达式构建为字符串

regex = dom"$"
Run Code Online (Sandbox Code Playgroud)

然后匹配regex变量

if ( $1 ~ regex ) {
  domain[dom]+=$2;
}
Run Code Online (Sandbox Code Playgroud)


gle*_*man 18

首先,变量dom不是$dom- 考虑$作为运算符来提取存储在变量中的列号的值dom

其次,awk不会插入其间的内容//- 那只是一个字符串.

您需要match()第二个参数可以是被视为正则表达式的字符串的函数:

if (match($1, dom "$")) {...}
Run Code Online (Sandbox Code Playgroud)

我会编写一个解决方案,如:

awk '
  FNR == NR {domain[$1] = 0; next}
  {
    for (dom in domain) {
      if (match($1, dom "$")) {
        domain[dom] += $2
        break
      }
    }
  }
  END {for (dom in domain) {print dom, domain[dom]}}
' domain site 
Run Code Online (Sandbox Code Playgroud)