Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String AWK文本文件比较(包含';b';文件和';文件中的字符串的次数)_String_Bash_Awk - Fatal编程技术网

String AWK文本文件比较(包含';b';文件和';文件中的字符串的次数)

String AWK文本文件比较(包含';b';文件和';文件中的字符串的次数),string,bash,awk,String,Bash,Awk,我有一个较小的txt文件,大约50000行(a.txt),还有一个较大的txt文件,大约1m行(b.txt) 我想知道b.txt包含a.txt中的字符串多少次 (if [[ $s1 == *"$s2"* ]]). 事实: 每行长度在5-65个字符之间 每行只包含一个字符串 仅限英文字母 字符串中没有空格 不会有精确的匹配 这是我的源代码。它正在工作,但速度相当慢。 你能帮我吗?我怎样才能做得更快 #!/bin/bash awk 'FNR==NR{a[$1]; next} {s=$1; for

我有一个较小的txt文件,大约50000行(a.txt),还有一个较大的txt文件,大约1m行(b.txt)

我想知道b.txt包含a.txt中的字符串多少次

(if [[ $s1 == *"$s2"* ]]).
事实: 每行长度在5-65个字符之间 每行只包含一个字符串 仅限英文字母 字符串中没有空格 不会有精确的匹配

这是我的源代码。它正在工作,但速度相当慢。 你能帮我吗?我怎样才能做得更快

#!/bin/bash

awk 'FNR==NR{a[$1]; next} {s=$1; for (i in a) if (index(i, $1)) s=s FS i; if (s!=$1) print  s}' a.txt b.txt > result.txt
理想的输出是results.txt:

例如:

a1string是a.txt中的第一个字符串,如果b.txt包含多个a1string,则在i writea1string中,以及b.txt中包含a1string的字符串

grep -F -c -f a.txt b.txt
-F
表示执行精确匹配,而不是正则表达式
-c
表示对匹配行进行计数,而不是打印它们
-f a.txt
表示从文件
a.txt
中获取要匹配的字符串,而不是从命令行参数中获取

要查看所有单个匹配项,请使用
-o
选项。然后通过管道将其输送到
sort
uniq
以获取每一个的计数

grep -F -o -f a.txt b.txt | sort | uniq -c | sort -nr

您好,不会有任何精确匹配精确匹配可以在行中的任何位置,它不匹配整行(这是
-x
选项所做的)。好的,现在我可以看到有14000个匹配。如何在b.txt中找到a.txt中的哪些字符串(以及找到了多少次)?您好,我可以对输出进行排序吗?(描述)当然可以。这就是管道之美。看更新我不认为有一个简单的方法可以使这从根本上更快。有一件事可能会有帮助,那就是用搜索字符串和匹配行将每个匹配项打印为一行,然后进行排序和汇总,但这可能会更慢,只是比当前的输出格式更难处理。也许搜索字符串文件可以转换为
flex
源文件并进行编译,但我怀疑这仍然不会使它更有效率。