快速查找awk的方法

快速查找awk的方法,awk,lookup,Awk,Lookup,我在一个文件中有一个列表,如下所示(实际大约335k): 我想在一些文件中查找此列表的存在,所有这些文件都具有相同的扩展名.count,这样我的输出将是,即每个.count文件中上述列表的二进制计数是多少: abc 1 efg 0 hij 1 (只要给我一个现在1分,缺席0分) 在我的代码中,我循环遍历扩展名为.count的每个文件,并查找上述字符列表的二进制分数,如下所示: awk -v lookup="$block" '$1 == lookup {count++

我在一个文件中有一个列表,如下所示(实际大约335k):

我想在一些文件中查找此列表的存在,所有这些文件都具有相同的扩展名.count,这样我的输出将是,即每个.count文件中上述列表的二进制计数是多少:

    abc 1
    efg 0
    hij 1
(只要给我一个现在1分,缺席0分) 在我的代码中,我循环遍历扩展名为.count的每个文件,并查找上述字符列表的二进制分数,如下所示:

 awk -v lookup="$block" '$1 == lookup {count++ ; if (count > 0) exit} END {if (count) print 1 ; else print 0}' $file.count

查找要花很长时间,我想知道是否有其他方法可以加快查找速度?

首先,这没有多大意义

{count++ ; if (count > 0) exit}
你知道为什么吗

其次,您可以通过将查找加载到数组中来减少循环,例如

awk 'NR==FNR{a[$1];next} {print $1 in a}' lookupfile otherfiles*
将打印每行的1/0数字

也可以打印ID

awk 'NR==FNR{a[$1];next} {print $1, $1 in a}' lookupfile otherfiles*
更新:修正了打字错误

以你为例

$ echo -e "abc\ndef\nghi" > lookup
$ echo ghi > file1
$ awk 'NR==FNR{a[$1];next} {print $1, $1 in a}' lookup file1
ghi 1
更新2:增强示例

如果顺序无关紧要,那么会更容易,但这也会保留顺序,并且可以同时运行多个文件。您可以调整打印标题(打印f)

使用此设置

$ echo -e "abc\ndef\nghi" > lookup
$ echo ghi > file1
$ echo abc > file2
你可以跑

$ awk 'NR==FNR{a[NR]=$1;c++;next} 
   FNR==1 && f{print f;
               for(k=1;k<=c;k++) print a[k], a[k] in b; delete b}
              {b[$1]; f=FILENAME}
           END{print f; 
               for(k=1;k<=c;k++) print a[k], a[k] in b; delete b}' lookup file1 file2

file1
abc 0
def 0
ghi 1
file2
abc 1
def 0
ghi 0
<代码> $AWK 'nr= fnr {a[nr]=1;C++;下一个} FNR==1&&f{print f;
对于(k=1;k你能添加一些标点符号让我理解你的问题吗?谢谢,我不知怎么知道我做得不对,谢谢你的输入。还有,我将如何打印那些查找文件的ID?有一个拼写错误,现在已修复,并添加了一个如何使用的示例。请编写一个小示例,就像我使用一个查找文件和两个复选框一样les并将其与原始问题中的预期结果一起发布。您必须处理冒号字符周围的空格。也许您应该使用新字段值提出新问题。。。
$ awk 'NR==FNR{a[NR]=$1;c++;next} 
   FNR==1 && f{print f;
               for(k=1;k<=c;k++) print a[k], a[k] in b; delete b}
              {b[$1]; f=FILENAME}
           END{print f; 
               for(k=1;k<=c;k++) print a[k], a[k] in b; delete b}' lookup file1 file2

file1
abc 0
def 0
ghi 1
file2
abc 1
def 0
ghi 0