Mam plik sekwencji i chcę policzyć kolejny znak „N” z jego pozycją wystąpienia i długością Powiedzmy, że mam plik o nazwie mySequence.fasta
takiej:
>sequence-1
ATCGCTAGCATNNNNNNNNNNNNNNCTAGCATCATGCNNNNNNATACGCATCACANNNNNNNNNCgcatATCAC
i oczekiwany wynik powinien wyglądać następująco:
Position 12 N 14
Position 38 N 6
Position 56 N 9
Uprzejmie pomóż mi rozwiązać ten problem awk
lub sed
podając nazwę mojego plikumySequence.fasta
awk
sed
perl
bioinformatics
Początkujący bioinformatyk
źródło
źródło
Odpowiedzi:
Możesz to zrobić za pomocą
awk
, któregomatch()
ustawienieRSTART
iRLENGTH
zmienna jest do tego całkiem użyteczne:Lub przy
perl
użyciu tablic@-
i,@+
które rejestrują początek i koniec meczów:Kolejne nieco szybsze (przynajmniej w mojej wersji
perl
)perl
podejście z wykorzystaniem ( eksperymentalnego )(?{...})
operatora wyrażenia regularnego:źródło
LC_ALL=C awk...
), aby przyspieszyć (po czym uważam, że wydajność jest porównywalnaperl
). Uważam, żemawk
jest to znacznie szybsze niżgawk
lubperl
na tym. Możesz przyspieszyć to jeszcze bardziej, jeśli na stałe kodujeszN
w kodzie jak wperl
.Inne
awk
rozwiązanie:Ponieważ cała
awk
implementacja nie obsługuje pustego FS (-F ''
), poniżej znajduje się poprawiony skrypt, który jest zgodny:Przykładowe dane wejściowe:
Wynik to:
źródło