特定の文字がファイルに出現する回数を数える方法は?


18

たとえば、すべての引用(")文字を数えたいとします。ファイルに必要以上の引用があるかどうか心配します。

例えば:

cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,"override_uid","true"
cluster-env,"recovery_enabled","false"

推測される結果:

16


bashスクリプトで欠落している引用を見つける最も簡単な方法を参照してくださいそれがあなたが本当に知りたいことなら。
G-Manは 'Reinstate Monica'

回答:


25

tr(文字の翻訳または削除)とwc(単語、行、文字のカウント)を組み合わせることができます。

tr -cd '"' < yourfile.cfg | wc -c

(の-d実装ですべてのキャラクターをc削除してから"、ハークターを数えますc。)


20

grepアプローチ:

grep -o '"' file | wc -l
16 
  • -o -一致した部分文字列のみを出力します

または単一のgawkで

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' -空のレコード区切り(改行の代わり)

  • FPAT='"' -パターン定義フィールド値


-oは、標準grepユーティリティに対する非標準のGNU拡張機能です。のPOSIXドキュメントにgrepは記載されいません。
Andrew Henle 2017

4

ファイルの2行に奇数の二重引用符がある場合、二重引用符の合計は偶数になり、不均衡な引用符は検出されません(これは実際に実行したいと思いますが、間違っている可能性があります) )。

このawkスクリプトは、奇数の引用符がある入力行のすべての行を報告します。

awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }'

我々は、(フィールドセパレータを設定FSする)"-F'"'そのラインがフィールドの偶数を有する場合、それが奇数の引用符を有することを意味します。NFは、最近のレコードのフィールドNR数であり、現在のレコードの序数(「行番号」)です。

次の入力があるとします。

$ cat file
cluster-env,"manage_dirs_on_root","true"
cluster-env,"one_dir_per_partition","false"
cluster-env,override_uid","true"
cluster-env,recovery_enabled","false"

我々が得る

$ awk -F'"' 'NF % 2 == 0 { printf("Line %d has odd quoting: %s\n", NR, $0) }' file
Line 3 has odd quoting: cluster-env,override_uid","true"
Line 4 has odd quoting: cluster-env,recovery_enabled","false"

何かのようなもの

$ grep -o '"' | wc -l

このファイルに対して「14」を返します。



2

純粋なBASH:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}

あるtmp配列は?はいの場合tmp、何の配列ですか?
ティム

@ティム、いいえ。 tmpこのスニペットでは、通常のシェル変数です。そして、この答えは、文字が質問で指定されたファイルではなく変数var)に出現する回数をカウントするため、この答えを否定しています。
ワイルドカード2017

0

試してください:

grep -0 '"' File -c

ただし、同じ行に2つ以上の文字がある場合、これは機能しません。彼らは1文字として数えられます


1
U&Lへようこそ!文字ではなく行を数えるので、これは実際には質問に答えているようには見えません。効果的な答えを書くことは、強くU&Lに奨励されている-を参照して答えるヘルプセンターで。あなたはこれを改善したいと思うかもしれません。
fra-san


0

偏心二重GNU grepメソッド:

grep -o \" file | grep -c .
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.