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

时间:2013-03-26 16:47:54

标签: 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 key2
grep -wo "\"key3\"" "filename.json" | uniq -c
1199 key3

所以,我想升级它以获取存储在文本文件中的一组键名,而不是在keyname参数中单独指定它们。如果它保持单行,并保持cat-free,甚至更好。

我不擅长单行,所以这就是我试过的:

(1)创建一个名为testkeys.sh的脚本:

#!/bin/bash
while read line
do
grep -wo $line "filename.json" | uniq -c
done

(2)创建一个名为keys.txt的密钥文件

key1
key2
key3

(3)然后

$ ./testkeys.sh keys.txt 

然而,这没有完成。

思想?

我试图找到一些方法将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。

1 个答案:

答案 0 :(得分:4)

uniq -c计算连续次数的数量。所以,你几乎就在那里,你只需要一个sort

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