Wie zähle ich, wie oft ein bestimmtes Zeichen in einer Datei erscheint?

17

Zum Beispiel möchten wir alle quote ( ") Zeichen zählen; Wir machen uns nur Sorgen, wenn Dateien mehr Anführungszeichen haben, als sie sollten.

Beispielsweise:

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

erwartete Ergebnisse:

16

Yael
quelle
Siehe Der einfachste Weg, ein fehlendes Zitat in einem Bash-Skript zu finden? ob du das wirklich wissen willst.
G-Man sagt "Reinstate Monica"

Antworten:

24

Sie können trZeichen kombinieren (übersetzen oder löschen) mit wc(Wörter, Zeilen, Zeichen zählen):

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

( -dGeben Sie alle Zeichen in der cReihenfolge von ein "und zählen cSie dann die Zeichen.)

Ulrich Schwarz
quelle
19

grep Ansatz:

grep -o '"' file | wc -l
16 
  • -o - Nur übereinstimmende Teilzeichenfolgen ausgeben

Oder mit einem Blick :

awk -v RS='' -v FPAT='"' '{print NF}' file
16
  • RS='' - leeres Datensatztrennzeichen (anstelle von Zeilenumbruch)

  • FPAT='"' - Muster, das den Feldwert definiert

RomanPerekhrest
quelle
-oist eine nicht standardmäßige GNU-Erweiterung des Standarddienstprogramms grep. Es wird in der POSIX-Dokumentation fürgrep nicht erwähnt .
Andrew Henle
4

Wenn zwei Zeilen in der Datei eine ungerade Anzahl von doppelten Anführungszeichen enthalten, ist die Gesamtsumme der doppelten Anführungszeichen gerade und Sie erkennen keine unausgeglichenen Anführungszeichen (dies ist das, was Sie vermutlich tatsächlich tun möchten, aber ich könnte mich irren ).

Dieses awkSkript meldet jede Zeile in der Eingabezeile, die eine ungerade Anzahl von Anführungszeichen enthält:

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

Wir setzten die Feldtrennzeichen ( FS) , um "mit -F'"'was bedeutet , dass , wenn eine Linie eine gerade Anzahl von Feldern hat sie ungeradee Anführungszeichen hat. NFist die Anzahl der Felder im letzten Datensatz und NRdie Ordnungszahl des aktuellen Datensatzes ("die Zeilennummer").

Angesichts der folgenden Eingabe:

$ 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"

wir bekommen

$ 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"

Etwas wie

$ grep -o '"' | wc -l

würde "14" für diese Datei zurückgeben.

Kusalananda
quelle
2

Ein weiterer gawkAnsatz:

awk -v RS=\" 'END{print NR-1}'
αғsнιη
quelle
2

Pure BASH:

var="$(< file.txt)"
tmp="${var//[^\"]/}"
echo ${#tmp}
Thunderbeef
quelle
Ist tmpein Array? Wenn ja, tmpist eine Reihe von was?
Tim
@ Tim, nein. tmpIn diesem Snippet befindet sich eine normale Shell-Variable. Und ich stimme dieser Antwort zu, weil dies zählt, wie oft ein Zeichen in einer Variablen ( var) und nicht in einer Datei erscheint, wie in der Frage angegeben.
Wildcard
0

Versuchen:

grep -0 '"' File -c

Dies funktioniert jedoch nicht, wenn sich zwei oder mehr Zeichen in derselben Zeile befinden. Sie werden als ein Zeichen gezählt

Abdulkarim Malkadi
quelle
1
Willkommen bei U & L! Dies scheint die Frage nicht wirklich zu beantworten, da Zeilen anstelle von Zeichen gezählt werden. Das Schreiben effektiver Antworten wird in U & L dringend empfohlen - siehe Antworten in der Hilfe. Vielleicht möchten Sie diesen verbessern.
Fra-San
0

grep -oF '"' Datei | wc -l

-F steht für feste Zeichenfolge

Shinek
quelle
Dies entspricht dem ersten Teil der Antwort von RomanPerekhrest, außer dass Sie die -FFlagge hinzugefügt haben , die hier nicht benötigt wird.
G-Man sagt "Reinstate Monica"
0

Exzentrische Doppel- GNU- grep Methode:

grep -o \" file | grep -c .
agc
quelle