2010-01-18 75 views
0

我在试图让一个看似简单的事情完成的过程中陷入困境。我有一个文件和一个换行符分隔的字符串列表。将文件与变量列表进行比较AWK

文件:

DAT1 LOC1

DAT2 LOC1

DAT3 LOC1

DAT4中Loc2

DAT5中Loc2

我的列表是这样的:

DAT1

DAT2

DAT3

DAT4

我所试图做的是列表中的数据文件进行比较并计算出现的唯一Loc的数量。我只对最大的数字感兴趣。在上面的例子中,列表进行比较,以该文件的情况下,我想主要为:

DAT1 MATCHED Loc1Count = 1

DAT2 MATCHED Loc1Count = 2

DAT3 MATCHED Loc1Count = 3

Dat4 MATCHED Loc2Count = 1

Return:Loc1 if Loc1Count /名单> 50%

现在的长度,

我知道AWK 1文件将逐行读取一个文件行。此外,我知道“echo”$ LIST“| awk'/搜索包含这个/的行”将返回与该内部字符串匹配的行。我还没有能够成功地将这些想法作为嵌套的awk结合起来,更不用说如何计算“loc1”与“loc2”(顺便说一句,这将是随机字符串,而不是形式标准)

我觉得这很简单,但我把头撞在墙上。有任何想法吗?这是否足够清楚?

+0

你正在寻找被称为关联数组(如** ghostdog74的**回答所示)的功能。 – 2010-01-18 23:50:50

回答

2
list="Dat1 Dat2 Dat3 Dat4" 
awk -vli="$list" 'BEGIN{ 
    # here list from shell is converted to awk array "list". 
    m=split(li,list," ") 
} 
{ 
    # go through the list 
    for(i=1;i<=m;i++){ 
     if($1 == list[i]){ 
      # if Dat? is found in list, print , at the same time 
      print $1" matched Locount="$2" "++data[$2] # increment the count for $2 and store in loc array 
      loc[$2]++ 
     } 
    } 
} 
END{ 
    # here returns loc1 count 
    loc1count=loc["Loc1"] 
    if((loc1count/m *100) > 50) { 
     print "Loc1 count: "loc1count 
    } 
} ' file 

输出

$ ./shell.sh 
Dat1 matched Locount=Loc1 1 
Dat2 matched Locount=Loc1 2 
Dat3 matched Locount=Loc1 3 
Dat4 matched Locount=Loc2 1 
Loc1 count: 3 
+0

哎呀 - 我很难找到如何将我的变量 “$ LIST” AWK:非法场$(),名称为 “LIST” 源1号线 返回时:msplit($ LIST,列表“\ n”) – 2010-01-19 00:05:13

+0

awk变量和shell变量是不同的。要将shell变量传递给awk,请使用-v选项。 – ghostdog74 2010-01-19 00:11:59

+0

我用awk -v LIST = $ {LIST}'BEGIN ... – 2010-01-19 00:14:36