Bash 用于计算文件中特定单词出现次数的命令行(例如json中的键数)

Bash 用于计算文件中特定单词出现次数的命令行(例如json中的键数),bash,shell,awk,grep,uniq,Bash,Shell,Awk,Grep,Uniq,对命令行的东西来说有点陌生,但是正在寻找一些指针 我使用以下快速脚本计算一个键在json文件中的次数: grep -wo "\"keyname\"" "filename.json" | uniq -c 1200 keyname 它工作得很好,但当我想测试一堆键的计数时,它会重复 grep -wo "\"key1\"" "filename.json" | uniq -c 1200 key1 grep -wo "\"key2\"" "filename.json" | uniq -c 1201 ke

对命令行的东西来说有点陌生,但是正在寻找一些指针

我使用以下快速脚本计算一个键在json文件中的次数:

grep -wo "\"keyname\"" "filename.json" | uniq -c
1200 keyname
它工作得很好,但当我想测试一堆键的计数时,它会重复

grep -wo "\"key1\"" "filename.json" | uniq -c
1200 key1
grep -wo "\"key2\"" "filename.json" | uniq -c
1201 key2
grep -wo "\"key3\"" "filename.json" | uniq -c
1199 key3
因此,我想将其升级为获取存储在文本文件中的键名数组,而不是在keyname参数中单独指定它们。如果这只是一条直线,而且保持不变,那就更好了

我不太擅长一句台词,因此我尝试了以下内容:

(1) 制作名为testkeys.sh的脚本:

#!/bin/bash
while read line
do
grep -wo $line "filename.json" | uniq -c
done
(2) 制作一个名为keys.txt的密钥文件

key1
key2
key3
(3) 然后

然而,这项工作没有完成

想法

我试图找到一些方法,将keys.txt的行转换成变量,以进入grep中的循环语句,但没有成功。期望的输出是

$ magic? | grep -wo $vars "filename.json" | uniq -c
1200 key1
1202 key2
1199 key3
更新

我知道grep可以使用-f标志将模式文件作为参数,但这似乎仍然需要以我不理解的方式对脚本进行重大更改。所以,举个例子

正在尝试转换

grep -wo "\"keyname\"" "filename.json" | uniq -c
进入

grep -wo -F -f keys.txt "filename.json" | uniq -c
产生

1 key1
1 key2
1 key1
1 key2
1 key1
1 key2
。。。很多次。它也比每次执行n次所需的速度快/多/长

我也试过这个,我觉得很酷:

$ cat keys.txt | xargs -0 -I keyname grep -wo keyname "filename.json" | uniq -c

但是这也运行了很长一段时间,并且没有超过count=1。uniq-c对连续出现的次数进行计数。那么,你就快到了,你只需要一个
排序

grep -wo -F -f keys.txt "filename.json" | sort | uniq -c

uniq-c
统计连续出现的次数。那么,你就快到了,你只需要一个
排序

grep -wo -F -f keys.txt "filename.json" | sort | uniq -c

你也可以考虑<代码> GRIP-O'KEY1\KEY2\KEY3\KEY4“文件名JSON”排序UNIQ-C/<代码>并比较执行时间。是的,这是完美的。谢谢我很困惑我的一个输出。你也可以考虑<代码> GRIP-O 'KEY1\KEY2\KEY3\KEY4“文件名JSON”排序UNIQ-C/<代码>并比较执行时间。是的,这是完美的。谢谢我真的被我的一个输出搞糊涂了。