2009-10-21 22 views
111

Czy istnieje sposób pod linuxem/terminalem do liczenia, ile razy znak f występuje w zwykłym pliku tekstowym?Liczba wystąpień znaku w pliku tekstowym

+4

należy na administratora – Malfist

+8

Technicznie można to uznać za sh/bash/etc. programowania pytanie, więc myślę, że ma ważność w każdym miejscu. –

+0

@Rob Hruska: tak, myślę też, że programowanie basha ... @abrashka: odpowiedź na twoje pierwsze i drugie pytanie brzmi "NIE"! – cupakob

Odpowiedz

159

Co powiesz na to? s:

fgrep -o f <file> | wc -l 

Uwaga: Oprócz łatwiejszego zapamiętywania/duplikowania i dostosowywania, jest to około trzy razy (przepraszam, edytuj! spartaczył pierwszy test) szybciej niż odpowiedź Vereba.

+0

Ten nie działa, jeśli potrzebujesz policzyć znaki' \ r' lub '\ n'; odpowiedź 'tr -cd f' działa na to. – bjnord

+1

Aby zliczyć kilka znaków, np. 'a',' b' i 'c', użyj' egrep': 'egrep -o 'a | b | c' | wc -l'. –

+0

Uważaj też, aby NIE używać 'wc -c' jak w' tr' answer: ponieważ 'grep' wyświetla linię po linii,' wc' zliczałby koniec linii jako znaki (stąd podwojenie liczby znaków). –

8
echo $(cat <file> | wc -c) - $(cat <file> | tr -d 'A' | wc -c) | bc 

gdzie A jest postać

Czas tego polecenia z pliku 4,9 MB i 1100000 wystąpień poszukiwanego Charakter:

real 0m0.168s 
user 0m0.059s 
sys 0m0.115s 
+1

To zajmuje około jednej trzeciej szybciej, jeśli usuniesz niepotrzebne 'cat's, podając nazwę pliku jako argument dla' wc' i 'tr'. – Cascabel

+0

Niestety tr działa tylko na standardowym wejściu – Vereb

+1

Jeśli naprawdę chcesz zoptymalizować, odczytuje plik tylko raz: echo $ (stat -c% s ) - $ (cat | tr -d 'A' | wc -c) | bc – Vereb

3

tr -d '\n' < file | sed 's/A/A\n/g' | wc -l

Wymiana dwóch wystąpienia "A" z twoją postacią i "plik" z twoim plikiem wejściowym.

  • tr -d '\n' < file: usuwa znaki nowej linii
  • sed 's/A/A\n/g: dodaje nowej linii po każdym wystąpieniu "A"
  • wc -l: zlicza liczbę wierszy

Przykład:

$ cat file 
abcdefgabcdefgababababbbba 


1234gabca 

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l 
9 
6

Jeśli wszystko, co trzeba zrobić, to policzyć liczbę wierszy zawierających swoją postać, to będzie działać:

grep -c 'f' myfile 

Jednak liczy się wiele wystąpień „f” na tej samej linii, co w jednym meczu.

56

nawet szybciej:

tr -cd f < file | wc -c 

Czas tego polecenia z pliku o 4,9 MB i 1100000 wystąpień poszukiwanego Charakter:

real 0m0.089s 
user 0m0.057s 
sys 0m0.027s 

czas na Vereb odpowiedzieć echo, cat, tr i bc dla tego samego pliku:

real 0m0.168s 
user 0m0.059s 
sys 0m0.115s 

Czas Rob HRUŠKA odpowiedzieć tr, sed i wc dla tego samego pliku:

real 0m0.465s 
user 0m0.411s 
sys 0m0.080s 

Czas na Jefromi odpowiedzieć fgrep i wc dla tego samego pliku:

real 0m0.522s 
user 0m0.477s 
sys 0m0.023s 
+2

Aby zliczyć kilka znaków, np. 'a',' b' i 'c':' tr -cd abc

+0

Uratowałeś mnie znajdując właściwą składnię dla 'tr'! – Pysis

Powiązane problemy