File 将文件与变量列表AWK进行比较
我在试图完成一件看似简单的事情时,遇到了麻烦。我有一个文件和一个换行符分隔的字符串列表 文件: 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”(顺便说一句,它们将是随机字符串,而不是标准形式)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计数=
我觉得这很简单,但我的头撞到了墙上。有什么想法吗?这是否足够清楚?您正在寻找的功能(如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