Odpowiedzi:
Jeśli szukasz wystąpienia 3 kolejnych znaków „T” w pliku, możesz to zrobić za pomocą grep. Czego próbowałeś, co nie zadziałało? I, jeśli chcesz tylko sprawdzić pierwszych 2000 linie pliku, można rura wyjście głowicy polecenia do grep. Na przykład, head -n 2000 somefile.txt | grep "TTT"
jeśli chcesz uzyskać liczbę wierszy w pliku zawierającym „TTT”, możesz użyć:
head -n 2000 somefile.txt | grep -c "TTT"
Jeśli niektóre linie mogą mieć wiele wystąpień i chcesz policzyć wszystkie wystąpienia, a nie tylko liczbę wierszy zawierających „TTT”, użyj -o
opcji grep , która wyświetli każde wystąpienie w osobnej linii, a następnie potokuje wyjście do wc polecenie, które wyświetli liczbę wszystkich wystąpień „TTT” w pierwszych 2000 wierszach pliku:
head -n 2000 somefile.txt | grep -o "TTT" | wc -l
Zwykle wyszukiwanie TTT
(3 T) w TTTTTT
(6 T) daje tylko 2 dopasowania, ponieważ wyszukiwanie następnego dopasowania odbywa się zaraz po znalezieniu poprzedniego dopasowania.
Spróbuję zilustrować:
TTTTTT
^ set starting position
TTTTTT
‾‾‾ found a match for TTT
TTTTTT
‾‾‾^ set next starting position
TTTTTT
‾‾‾ found a match for TTT
TTTTTT
^ end of stream
Jeśli chcesz rozważyć TTTTTT
cztery instancje TTT
, sugeruję, abyś dopasował tylko jedną postać, a następnie użyj lookaround, aby ukończyć pasujący wzór.
W swoim rozwiązaniu użyję lookahead:
head -2000 file | /usr/gnu/bin/grep -P -o 'T(?=TT)' | wc -l
Objaśnienia do grep
części:
grep
wyrażenia regularnego Perla, aby użyć lookahead; w moim systemie muszę to określić/usr/gnu/bin/grep
-P
aktywować tryb wyrażeń regularnych Perla-o
aby wyświetlić każde wystąpienie w osobnej linii, aby umożliwić wc -l
policzenie każdego dopasowania'T(?=TT)'
jest wyrażeniem regularnym do dopasowania, po T
którym następuje TT
(za pomocą lookahead); Po znalezieniu dopasowania silnik wyrażeń regularnych rozpocznie się od drugiej, T
aby spróbować znaleźć następne dopasowanie, umożliwiając, aby ta sekunda T
była częścią następnego dopasowania, jeśli jest zgodna ze wzorcem.Używając przykładowego ciągu z komentarza:
i przetwarzanie go za pomocą powyższego wyrażenia regularnego:
echo 'JKHFSDTTTJSDJHTTTTTKSJTIITTT' | /usr/gnu/bin/grep -P --color=always 'T(?=TT)'
będzie produkować:
co znaczy:
Ilustracja:
JKHFSDTTTJSDJHTTTTTKSJTIITTT
^ set starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
‾^ found a match for T(?=TT) & set next starting position
JKHFSDTTTJSDJHTTTTTKSJTIITTT
^ end of stream