File 将文件与变量列表AWK进行比较

File 将文件与变量列表AWK进行比较,file,sed,awk,grep,File,Sed,Awk,Grep,我在试图完成一件看似简单的事情时,遇到了麻烦。我有一个文件和一个换行符分隔的字符串列表 文件: Dat1 Loc1 Dat2 Loc1 Dat3 Loc1 Dat4 Loc2 Dat5 Loc2 我的清单如下: Dat1 Dat2 Dat3 Dat4 我试图做的是将列表与数据文件进行比较,并计算出现的唯一LOC的数量。我只对最大数量的产品感兴趣。在上面的示例中,当将列表与文件进行比较时,我基本上希望: Dat1匹配的Loc1Count=1 Dat2匹配的位置1计数=2 Dat3匹配的位置1计数=

我在试图完成一件看似简单的事情时,遇到了麻烦。我有一个文件和一个换行符分隔的字符串列表

文件:

Dat1 Loc1

Dat2 Loc1

Dat3 Loc1

Dat4 Loc2

Dat5 Loc2

我的清单如下:

Dat1

Dat2

Dat3

Dat4

我试图做的是将列表与数据文件进行比较,并计算出现的唯一LOC的数量。我只对最大数量的产品感兴趣。在上面的示例中,当将列表与文件进行比较时,我基本上希望:

Dat1匹配的Loc1Count=1

Dat2匹配的位置1计数=2

Dat3匹配的位置1计数=3

Dat4匹配的Loc2Count=1

返回:Loc1如果Loc1计数/列表长度>50%

现在,

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


我觉得这很简单,但我的头撞到了墙上。有什么想法吗?这是否足够清楚?

您正在寻找的功能(如ghostdog74的答案所示)称为关联数组。哎呀-我很难找到如何包含我的变量“$LIST”awk:invalize field$(),name“LIST”源代码行号1时返回:msplit($LIST,LIST,“\n”)awk变量和shell变量是不同的。要将shell变量传递给awk,可以使用-v option.-v LIST=“${LIST}”在awk中传递变量。但是,现在我对新行分隔符有困难。错误-字符串Dat1中的换行符。。。在源代码第1行,显示如何获取您的$LIST。或者更好的是,展示你拥有的代码。投票吧,awk的伟大使用,幽灵狗,你介意对代码做一些评论吗?
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