Jak wyszukiwać podciągi w Bash?

3

Chcę dowiedzieć się i wyświetlić całkowitą liczbę podciągów TTT znalezionych w pierwszych 2000 wierszach w pliku.

Byłem przy użyciu grep aż Przetestowałem go i sobie sprawę, że nie identyfikuje podciągi.

bez nazwy
źródło

Odpowiedzi:

1

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

punkt księżycowy
źródło
1
Cześć i dziękuję za odpowiedź! Pierwotnie użyłem tego samego polecenia, jednak kiedy przetestowałem grep przy znacznie krótszym pliku zawierającym coś takiego: JKHFSDTTTJSDJHTTTTKSKSTITI, nie rozpoznaje trzech podciągów TTT w TTTTT, podświetli pierwsze podciąg „TTT'TT i zignoruje ostatnie dwa. : /
noname
0

Wyjaśnienie

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

Rozwiązanie

Jeśli chcesz rozważyć TTTTTTcztery 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 grepczęści:

  • Użyj grepwyraż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
  • -oaby wyświetlić każde wystąpienie w osobnej linii, aby umożliwić wc -lpoliczenie każdego dopasowania
  • 'T(?=TT)'jest wyrażeniem regularnym do dopasowania, po Tktó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.

Przykład

Używając przykładowego ciągu z komentarza:

  • JKHFSDTTTJSDJHTTTTTKSJTIITTT

i przetwarzanie go za pomocą powyższego wyrażenia regularnego:

echo 'JKHFSDTTTJSDJHTTTTTKSJTIITTT' | /usr/gnu/bin/grep -P --color=always 'T(?=TT)'

będzie produkować:

  • JKHFSD T TTJSDJH TTT TTKSJTII T TT (tzn. Podświetli 5 T)

co znaczy:

  • znajduje 5 dopasowań :)

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
aff
źródło