2009-09-02 5 views
31

Ich habe ein paar Textdateien und ich möchte zählen, wie oft ein Buchstabe in jedem erscheint?Wie kann ich mit der UNIX-Shell zählen, wie oft ein Buchstabe in einer Textdatei angezeigt wird?

Insbesondere möchte ich die UNIX-Shell dazu verwenden, in Form von: Cat-Datei | .... mach was ...

Gibt es eine Möglichkeit, dass ich den wc-Befehl dazu bringen kann?

+0

cat Datei | ist ein Nein, nein, denke nicht einmal daran. Meist wird es mit weniger oder Grep verwendet, wo die Katze nicht benötigt wird. Bitte verwenden Sie nicht cat, wenn Sie die Datei nicht einfach ausgeben wollen. –

+2

cat ist tatsächlich nützlich, um die RAM-Nutzung auf ein Minimum zu beschränken. Es ist nützlich, wenn Sie mit großen Dateien arbeiten, da es zeilenweise durch die Pipeline fließt. – Goran

Antwort

39
grep char -o filename | wc -l 
+7

Hinweis für diejenigen, die zunächst wie ich verwirrt sind, ersetzen Sie "char" durch das Zeichen oder die Zeichenfolge, die Sie suchen. – rlorenzo

+1

Außerdem haben die meisten grep-Implementierungen eine "-c" -Option zum Zählen. –

+0

Das obige funktioniert auch für Strings, also 'grep -o | wc -l ist die generische Version. ZB: 'grep, -o myfile.txt | wc -l zählt die Anzahl der Kommas in myfile.txt und 'grep abcd -o myfile.txt | wc -l zählt die Anzahl von 'abcd's in myfile.txt – arun

0

versuchen Sie es mit

grep [PATTERN] -o [FILE] | wc -l 

und benutzen Sie bitte Katze nicht, wenn nicht benötigt.

+0

Was ist falsch mit der Verwendung von Katze? – samoz

+1

es zählt nicht mehrere Zeichen pro Zeile – SilentGhost

+0

@samoz: Katze ist falsch, da es die gelesene Datei in ein anderes Programm eingeben sollte - das andere Programm ist in der Lage, die Datei selbst zu lesen, so dass die Verwendung von Cat nicht benötigt wird und kompliziert die Codezeile. @SilentGhost: Ihr Recht. –

1

Alternative zu grep:

sed 's/[^x]//g' filename | tr -d '\012' | wc -c 

wo x das Zeichen, das Sie zählen wollen, ist.

1

gibt es auch awk:

$ echo -e "hello world\nbye all" | awk -Fl '{c += NF - 1} END {print c}' 
5 

ändern -Fl zu -F<your character>.

von -F angegeben Dies funktioniert, indem das Feld Trennzeichen das Zeichen Einstellung, dann in jeder Zeile die Anzahl der Felder akkumulieren - 1 (denn wenn es ein Trennzeichen ist, gibt zwei Felder sind - aber wir sollten nur 1 zählen).

11

Eine weitere Alternative:

tr -d -C X <infile | wc -c 

wobei X das Zeichen oder die Zeichenfolge, die Sie wollen, zu zählen und infile ist die Eingabedatei.

+2

Dies ist sauberer als die angenommene Antwort (die auf der Tatsache beruht, dass die Ausgabe von 'grep -o' durch Zeilentrenner getrennt ist). Dies funktioniert auch mit jedem Zeichen (einschließlich '\ n') – Camusensei

0

ist hier eine andere Art und Weise

cat input_file | \ 
awk 'BEGIN {FS="x"; var=0 } \ 
{if (NF>0){ var=var + (NF-1) } } \ 
END{print var}' 

wobei X das Zeichen oder die Zeichenfolge, die Sie wollen, zu zählen und infile ist die Eingabedatei

+0

Nizza' UUOC' dort – Camusensei

1
awk '{ printf "%s\n", gsub("ur_char", "oth_char", $0) }' <your_file_name> output.txt 

Sie Anzahl der aktuellen Zeilennummer hinzufügen können, um bekomme die Zeilennummern auch in awk.

1

Echo "a/b/c/d/e/f/g" | awk -F "/" '{print NF}'

dies wird die Anzahl des Auftretens von Zeichen "/"

+0

Dies funktioniert nicht mit mehrzeiligen Eingabe – Camusensei

1

In diesem Fall geben, i'am den Charakter zu zählen "|":

expr `wc -c < filename` \- `tr -d \| < filename | wc -c` 
1

Sie können ganz einfach versuchen: grep -c 'YOUR LETTER' YOUR FILE

+0

die Nummer wird auf der Shell angezeigt, in der Newline –