0

コマンドライン関連のものは少し新しいですが、いくつかのポインタを探しています。

次のクイックスクリプトを使用して、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さらに良いでしょう。

私はワンライナーがあまり得意ではないので、代わりにこれを試しました:

(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を超えて集計されませんでした。

4

1 に答える 1

4

uniq -c連続した発生の数をカウントします。だから、あなたはほとんどそこにいます、あなたはただ必要ですsort

grep -wo -F -f keys.txt "filename.json" | sort | uniq -c
于 2013-03-26T17:17:40.517 に答える