0

我有两个文件。 domain.txt包含一些域

facebook.com
google.com
yahoo.com

site.txt包含域下的一些站点,以及它们的 URL 编号。

music.google.com  2
image.google.com  3
music.facebook.com  8
image.facebook.com  4
map.yahoo.com   4
new.yahoo.com   7

我将选择站点,其 URL 编号大于其域的平均 URL 编号。例如,google.com的平均 URL 数为(2+3)/2=2.5,因此会选择image.google.com 。

我写了这样的awk脚本:

BEGIN {
        #read all domains into memory
        while(getline dom < "./domain.txt" > 0){
                domain[dom]=0;
        }

        #count URLs number and sites number under each domain
        for (dom in domain){
                sitenumber=0;

                close("./site.txt")
                while(getline < "./site.txt" >0){
                        if(match($1,"."dom"$")){
                                domain[dom]+=$2;
                                sitenumber++;
                                printf("%s\n",$0) >> "./sitesunderdomain";
                        } 
                }

                avgsitenumber = domain[dom]/sitenumber;
                system("cat ./sitesunderdomain") #test output

                close("./sitesunderdomain")
                while(getline < "./sitesunderdomain" >0){ #loop A
                        print "why1" #test output
                        if($2>=avgsitenumber){
                                print "why2"  #testoutput
                                print $0,avgsitenumber>>"./result"
                        }
                }
                system("> ./sitesunderdomain")
        }#for
}

然后我在 bash 中运行 awk 脚本,得到输出:

music.facebook.com  8
image.facebook.com 4
why1
why2
why1
music.google.com   2
image.google.com  3
map.yahoo.com  4
news.yahoo.com  7

./结果是

music.facebook.com  8  6

但正如我所料,输出应该是

music.facebook.com  8
image.facebook.com 4
why1
why2
why1
music.google.com   2
image.google.com  3
why1
why2
why1
map.yahoo.com  4
news.yahoo.com  7
why1
why2
why1

./result应该是:

music.facebook.com  8  6
image.google.com  3  2.5
news.yahoo.com  7  5.5

似乎在位置loop Agetline返回google.comyahoo.com的时间。 为什么?0dom

4

2 回答 2

2

你的代码是一团糟。这不是使用awk. Awk自动为您打开并逐行读取您的文件,这不是使用getline. 这仅适用于特殊情况。

首先

close("./site.txt")
while(getline < "./site-test" >0){

./site-test? 你的文件是test.txt. 它在我的测试中死亡。

第二:当您可以直接从 RAM 中重用数据时,无需创建文件,例如使用数组。

第三:我根本不喜欢您的代码,但要修复它,请./sitesunderdomain在读取getline和删除之间关闭您的临时文件system("> ./sitesunderdomain"),例如:

## NOT here.
##close("./sitesunderdomain")

while(getline < "./sitesunderdomain" >0){ #loop A
        print "why1" #test output
        if($2>=avgsitenumber){
                print "why2"  #testoutput
                print $0,avgsitenumber>>"./result"
        }
}

## Better here between the read and the write.
close("./sitesunderdomain")

system("> ./sitesunderdomain")

现在像这样运行脚本:

awk -f myscript.awk domain.txt site.txt

并检查输出:

cat result

结果如下:

music.facebook.com  8 6
image.google.com  3 2.5
new.yahoo.com   7 5.5
于 2012-07-18T17:01:59.773 回答
1

我无法理解您的脚本。无需手动打开这样的文件;awk 自己处理。如果您的代码可以修复,我不是那个人。

这是我想出的:

#!/usr/bin/awk -f

{
  domain=$1; sub(/^[a-z]*\./, "", domain);
  mean[domain]=(mean[domain]*count[domain]+$2)/++count[domain];
  score[$1]=$2;
}

END {
  printf("%7s\t%6s\t%s\n", "score", "mean", "domain");
  for (hostname in score) {
    domain=hostname; sub(/^[a-z]*\./, "", domain);
    if (score[hostname] > mean[domain]) {
      printf("%6d\t%6.2f\t%s\n", score[hostname], mean[domain], hostname);
    }
  }
}

当我对您的数据运行它时,我得到以下结果:

  score   mean  domain
     3    2.50  image.google.com
     8    6.00  music.facebook.com
     7    5.50  new.yahoo.com

这是你期待的输出吗?

于 2012-07-18T17:09:18.850 回答