计算文件中某个模式的出现次数,对于缺失的模式包括零
Counting occurrences of a pattern in a file, include zero for missing patterns
我正在尝试计算文件 (file.txt) 中某个模式(列在 pattern.txt 中)的出现次数:
grep -o -w -f pattern.txt file.txt | sort | uniq -c > output.txt
效果很好,但我希望输出还包括文件中未出现的模式的 0。
我该如何完成?
让我们面对现实吧,你在做什么?
您正在文件中查找某些模式。如果他们在场,你就展示给他们看。然后你再数一数。
现在你说对于那些不存在的,你希望数字也可见。
作为一个单行者,这恐怕是没有意义的。
因此我选择了另一种工作方式:grep
包含一个用于不存在的模式的开关 (-v
)。您可以在这些模式前面添加自己的数字 0
并将它们附加到您的列表中。
作为起点:grep -v -f pattern.txt file.txt
(未测试)。
您可以将模式添加到排序中,然后在 uniq 之后减去 1:
grep -o -w -F -f pattern.txt file.txt |\
sort - pattern.txt |\
uniq -c |\
awk '{ = sprintf("%7d", -1) } 1' > output.txt
请注意,这仅在模式是固定字符串时才有意义,因此我在 grep 中添加了 -F
选项。
此外,这个特定的 awk
脚本将压缩模式中的空白。您将需要更复杂的代码来避免这种情况。
假设图案不包含白色 space ...
$ cat pattern.txt
abc
def
ghi
$ cat file.txt
line 1 no match
line 2 one abc match
line 3 two ghi matches abc
OP的当前代码:
$ grep -o -w -f pattern.txt file.txt | sort | uniq -c
2 abc
1 ghi
使用 join
和 OP 当前 grep/sort/uniq
的一个想法:
join -1 1 -2 2 -a 1 -e 0 -o 2.1,1.1 pattern.txt <(grep -o -w -f pattern.txt file.txt| sort | uniq -c)
其中:
-1 1 -2 2
- 加入文件 #1 (-1
== pattern.txt
) 字段 #1 和 文件 #2 (-2
== grep/sort/uniq
) 字段 #2
-a 1
- 包括文件 #1 中的所有行,即使没有匹配项
-e 0
- 用字符 0
填充空白字段
-o 1.1,2.1
- 输出格式:文件#2.field #1 +
文件#1.field #1
这会生成:
2 abc
0 def
1 ghi
就个人而言,我可能会选择基于 awk
的更强大的解决方案,但对于简单的字符串(没有白色 space)这可能就足够了,ymmv ...
我正在尝试计算文件 (file.txt) 中某个模式(列在 pattern.txt 中)的出现次数:
grep -o -w -f pattern.txt file.txt | sort | uniq -c > output.txt
效果很好,但我希望输出还包括文件中未出现的模式的 0。
我该如何完成?
让我们面对现实吧,你在做什么?
您正在文件中查找某些模式。如果他们在场,你就展示给他们看。然后你再数一数。
现在你说对于那些不存在的,你希望数字也可见。
作为一个单行者,这恐怕是没有意义的。
因此我选择了另一种工作方式:grep
包含一个用于不存在的模式的开关 (-v
)。您可以在这些模式前面添加自己的数字 0
并将它们附加到您的列表中。
作为起点:grep -v -f pattern.txt file.txt
(未测试)。
您可以将模式添加到排序中,然后在 uniq 之后减去 1:
grep -o -w -F -f pattern.txt file.txt |\
sort - pattern.txt |\
uniq -c |\
awk '{ = sprintf("%7d", -1) } 1' > output.txt
请注意,这仅在模式是固定字符串时才有意义,因此我在 grep 中添加了 -F
选项。
此外,这个特定的 awk
脚本将压缩模式中的空白。您将需要更复杂的代码来避免这种情况。
假设图案不包含白色 space ...
$ cat pattern.txt
abc
def
ghi
$ cat file.txt
line 1 no match
line 2 one abc match
line 3 two ghi matches abc
OP的当前代码:
$ grep -o -w -f pattern.txt file.txt | sort | uniq -c
2 abc
1 ghi
使用 join
和 OP 当前 grep/sort/uniq
的一个想法:
join -1 1 -2 2 -a 1 -e 0 -o 2.1,1.1 pattern.txt <(grep -o -w -f pattern.txt file.txt| sort | uniq -c)
其中:
-1 1 -2 2
- 加入文件 #1 (-1
==pattern.txt
) 字段 #1 和 文件 #2 (-2
==grep/sort/uniq
) 字段 #2-a 1
- 包括文件 #1 中的所有行,即使没有匹配项-e 0
- 用字符0
填充空白字段
-o 1.1,2.1
- 输出格式:文件#2.field #1+
文件#1.field #1
这会生成:
2 abc
0 def
1 ghi
就个人而言,我可能会选择基于 awk
的更强大的解决方案,但对于简单的字符串(没有白色 space)这可能就足够了,ymmv ...