Próbuję wyodrębnić identyfikator sekwencji i numer klastra, które występują w różnych liniach w tym samym pliku tekstowym.
Wygląda jak wejście
>Cluster 72
0 319aa, >O311_01007... *
>Cluster 73
0 318aa, >1494_00753... *
1 318aa, >1621_00002... at 99.69%
2 318aa, >1622_00575... at 99.37%
3 318aa, >1633_00422... at 99.37%
4 318aa, >O136_00307... at 99.69%
>Cluster 74
0 318aa, >O139_01028... *
1 318aa, >O142_00961... at 99.69%
>Cluster 75
0 318aa, >O300_00856... *
Pożądanym wynikiem jest identyfikator sekwencji w jednej kolumnie i odpowiedni numer klastra w drugiej.
>O311_01007 72
>1494_00753 73
>1621_00002 73
>1622_00575 73
>1633_00422 73
>O136_00307 73
>O139_01028 74
>O142_00961 74
>O300_00856 75
Czy ktoś może w tym pomóc?
>
? Być może zainteresuje Cię także nasza siostrzana strona Bioinformatyka .Odpowiedzi:
Z awk:
-F '[. ]*'
>Cluster
liniami) zapisz drugie pole jako identyfikator i przejdź do następnej liniiźródło
$1 == ">Cluster"
zamiast tego jawnie szukaćNF == 2
, w zależności od tego, co jeszcze może znajdować się w pliku.Możesz użyć
awk
do tego:Pierwsza instrukcja bloku przechwytuje identyfikator klastra. Druga instrukcja blokowa (domyślna) wyodrębnia potrzebne dane i drukuje je.
źródło
" "
za argumentprint
. Wystarczy użyć przecinka, aby oddzielić argumenty, a on użyje OFS, domyślnej spacji, aby oddzielić argumenty.Oto alternatywa dla Ruby jako jednej linijki:
lub rozłożone na wiele linii:
Myślę, że jest to bardziej czytelne niż
awk
wersja, jeśli znasz Ruby i regexen. Jako bonus, ten kod może być nieco bardziej niezawodny niż zwykłe dzielenie linii, ponieważ szuka otaczającego tekstu.źródło
Perl:
Wyjaśnienie
perl -ne
: przeczytaj plik wejściowy linia po linii (-n
) i zastosuj skrypt podany przez-e
dla każdej linii.if(/^>.*?(\d+)/){$n=$1;}
: jeśli ta linia zaczyna się od a>
, znajdź najdłuższy odcinek liczb na końcu linii i zapisz go jako$n
.else{ s/.*(>[^.]+).*/$1 $n/; print
: jeśli linia nie zaczyna się od>
, zamień wszystko na najdłuższy odcinek.
znaków niebędących znakami po>
(>[^.]+
), tj. nazwę sekwencji ($1
ponieważ przechwyciliśmy dopasowanie wyrażenia regularnego) i bieżącą wartość$n
.Lub, dla bardziej podejrzanego podejścia:
Jest to tylko nieco bardziej kłopotliwy sposób zrobienia tego samego podstawowego pomysłu, co różne
awk
podejścia. Załączam to ze względu na ukończenie i dla fanów Perla. Jeśli potrzebujesz wyjaśnienia, skorzystaj z rozwiązań awk :).źródło