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


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.)


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


-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.



2

Pure BASH:

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

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


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

Exzentrische Doppel- GNU- grep Methode:

grep -o \" file | grep -c .
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.