![começar e terminar](https://rvso.com/image/164699/come%C3%A7ar%20e%20terminar.png)
Tenho blocos de dados abaixo (múltiplos)
chr1.trna4 (17188416-17188486) Length: 71 bp
Type: Gly Anticodon: CCC at 33-35 (17188448-17188450) Score: 78.3
HMM Sc=56.60 Sec struct Sc=21.70
* | * | * | * | * | * | * |
Seq: GCATTGGTGGTTCAGTGGTAGAATTCTCGCCTCCCACGCGGGAGaCCCGGGTTCAATTCCCGGCCAATGCA
Str: >>>>>>>..>>>>.......<<<<.>>>>>.......<<<<<....>>>>>.......<<<<<<<<<<<<.
Para cada bloco, preciso encontrar o 8º padrão na última linha do bloco que começa com Str
. No caso acima, o 8º padrão é .......
(7 períodos). Isso ocorre porque o primeiro conjunto de >
símbolos forma um padrão, o segundo conjunto de períodos forma o segundo padrão e assim por diante.
Agora preciso extrair esses 7 caracteres da Seq
linha diretamente acima da linha do padrão. No exemplo, isso corresponde à subsequência CTCCCAC
.
A saída deve serSeq is CTCCCAC and Anticodon: CCC
Isso é possível em bash
ou em qualquer shell?
Mais exemplos de blocos de dados
chr19.trna11 (4724719-4724647) Length: 73 bp
Type: Val Anticodon: CAC at 34-36 (4724686-4724684) Score: 79.2
HMM Sc=49.10 Sec struct Sc=30.10
* | * | * | * | * | * | * |
Seq: GTTTCCGTAGTGTAGCGGTtATCACATTCGCCTCACACGCGAAAGGtCCCCGGTTCGATCCCGGGCGGAAACA
Str: >>>>>>>..>>>..........<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.
chr19.trna12 (1383433-1383361) Length: 73 bp
Type: Phe Anticodon: GAA at 34-36 (1383400-1383398) Score: 88.9
HMM Sc=68.40 Sec struct Sc=20.50
* | * | * | * | * | * | * |
Seq: GCCGAAATAGCTCAGTTGGGAGAGCGTTAGACTGAAGATCTAAAGGtCCCTGGTTCGATCCCGGGTTTCGGCA
Str: >>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.
chr21.trna1 (18827177-18827107) Length: 71 bp
Type: Gly Anticodon: GCC at 33-35 (18827145-18827143) Score: 80.9
HMM Sc=60.10 Sec struct Sc=20.80
* | * | * | * | * | * | * |
Seq: GCATGGGTGGTTCAGTGGTAGAATTCTCGCCTGCCACGCGGGAGGCCCGGGTTCGATTCCCGGCCCATGCA
Str: >>>>>>>..>>>>.......<<<<.>>>>>.......<<<<<....>>>>>.......<<<<<<<<<<<<.
chrX.trna4 (18693101-18693029) Length: 73 bp
Type: Val Anticodon: TAC at 34-36 (18693068-18693066) Score: 82.9
HMM Sc=54.70 Sec struct Sc=28.20
* | * | * | * | * | * | * |
Seq: GGTTCCATAGTGTAGTGGTtATCACGTCTGCTTTACACGCAGAAGGtCCTGGGTTCGAGCCCCAGTGGAACCA
Str: >>>>>>>..>>>..........<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.
chrX.trna6 (3833344-3833271) Length: 74 bp
Type: Ile Anticodon: GAT at 35-37 (3833310-3833308) Score: 75.5
HMM Sc=50.20 Sec struct Sc=25.30
* | * | * | * | * | * | * |
Seq: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA
Str: >>>>>>>..>>>>.........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.
chrX.trna8 (3794915-3794842) Length: 74 bp
Type: Ile Anticodon: GAT at 35-37 (3794881-3794879) Score: 75.5
HMM Sc=50.20 Sec struct Sc=25.30
* | * | * | * | * | * | * |
Seq: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA
Str: >>>>>>>..>>>>.........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.
chrX.trna10 (3756491-3756418) Length: 74 bp
Type: Ile Anticodon: GAT at 35-37 (3756457-3756455) Score: 75.5
HMM Sc=50.20 Sec struct Sc=25.30
* | * | * | * | * | * | * |
Seq: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA
Str: >>>>>>>..>>>>.........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.
chr19.trna8 (45981945-45981859) Length: 87 bp
Type: SeC Anticodon: TCA at 36-38 (45981910-45981908) Score: 146.9
HMM Sc=0.00 Sec struct Sc=0.00
* | * | * | * | * | * | * | * | *
Seq: GCCCGGATGATCCTCAGTGGTCTGGGGTGCAGGCTTCAAACCTGTAGCTGTCTAGCGACAGAGTGGTTCAATTCCACCTTTCGGGCG
Str: >>>>>>>.>..>>>>>>....<<<<<<<<<<<<.......<<<<<<.>>>>>....<<<<<.>>>>.......<<<<<.<<<<<<<.
Responder1
Usando awk
:
$ awk -f script.awk file
Sequence: CTCACAC, Anticodon: CAC, Type: Val
Sequence: CTGAAGA, Anticodon: GAA, Type: Phe
Sequence: CTGCCAC, Anticodon: GCC, Type: Gly
Sequence: TTTACAC, Anticodon: TAC, Type: Val
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTTCAAA, Anticodon: TCA, Type: SeC
Onde script.awk
está o seguinte awk
programa:
/^Type:/ {
type = $2
anticodon = $4
split($6, pos, "-")
}
/^Seq:/ {
seq = substr($2, pos[1]-2, length(anticodon) + 4)
# or: seq = substr($2, pos[1]-2, pos[2]-pos[1]+5)
printf "Sequence: %s, Anticodon: %s, Type: %s\n", seq, anticodon, type
}
O primeiro bloco é acionado por qualquer linha começando com a string Type:
e seleciona o tipo e a sequência do anticódon do 2º e 4º campos delimitados por espaços em branco e divide o 6º campo -
para produzir as coordenadas inicial e final na sequência.
O segundo bloco é acionado por uma linha começando com a string Seq:
e seleciona a sequência do segundo campo delimitado por espaços em branco usando a posição inicial do anticódon e o comprimento do anticódon lido na última Type:
linha, certificando-se de obter algumas bases -pares de cada lado.
A saída é então produzida.
O sed
script a seguir usa o 8º "padrão" da Str:
linha para extrair a sequência desejada em vez das posições numéricas do anticódon fornecidas na Type:
linha.
/^Type:[[:blank:]]*/ {
s/.*Type: \([^[:blank:]]*\)[[:blank:]]*Anticodon: \([^[:blank:]]*\).*/ Anticodon: \2, Type: \1/
h
}
/^Seq:[[:blank:]]*/ {
s//Sequence: /
G
y/\n/,/
w data.tmp
}
/^Str:[[:blank:]]*/ {
s///
s,\(\(\([<>.]\)\3*\)\{7\}\)\(\([<>.]\)\5*\).*,s/: \1\\(\4\\)[^\,]*/: \\1/;n,
y/<>/../
w pass2.sed
}
d
(o final d
não é um erro de digitação).
Isso é feito em duas passagens.
Na primeira passagem, dois novos arquivos são criados data.tmp
e pass2.sed
.
$ sed -f script.sed file
(não há saída de terminal disso)
Para os dados fornecidos, data.tmp
será semelhante a
Sequence: GTTTCCGTAGTGTAGCGGTtATCACATTCGCCTCACACGCGAAAGGtCCCCGGTTCGATCCCGGGCGGAAACA, Anticodon: CAC, Type: Val
Sequence: GCCGAAATAGCTCAGTTGGGAGAGCGTTAGACTGAAGATCTAAAGGtCCCTGGTTCGATCCCGGGTTTCGGCA, Anticodon: GAA, Type: Phe
Sequence: GCATGGGTGGTTCAGTGGTAGAATTCTCGCCTGCCACGCGGGAGGCCCGGGTTCGATTCCCGGCCCATGCA, Anticodon: GCC, Type: Gly
Sequence: GGTTCCATAGTGTAGTGGTtATCACGTCTGCTTTACACGCAGAAGGtCCTGGGTTCGAGCCCCAGTGGAACCA, Anticodon: TAC, Type: Val
Sequence: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA, Anticodon: GAT, Type: Ile
Sequence: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA, Anticodon: GAT, Type: Ile
Sequence: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA, Anticodon: GAT, Type: Ile
Sequence: GCCCGGATGATCCTCAGTGGTCTGGGGTGCAGGCTTCAAACCTGTAGCTGTCTAGCGACAGAGTGGTTCAATTCCACCTTTCGGGCG, Anticodon: TCA, Type: SeC
while pass2.sed
é um sed
script que pós-processa isso:
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ..............................\(.......\)[^,]*/: \1/;n
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: .................................\(.......\)[^,]*/: \1/;n
Aplicando pass2.sed
em data.sed
dá-lhe o resultado final:
$ sed -f pass2.sed data.tmp
Sequence: CTCACAC, Anticodon: CAC, Type: Val
Sequence: CTGAAGA, Anticodon: GAA, Type: Phe
Sequence: CTGCCAC, Anticodon: GCC, Type: Gly
Sequence: TTTACAC, Anticodon: TAC, Type: Val
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTTCAAA, Anticodon: TCA, Type: SeC
Observação: não tenho certeza do desempenho da segunda etapamuitograndes conjuntos de dados.
Responder2
Dado que podemos extrair o índice inicial junto com o anticódon:
len=7
prior=2
while IFS= read -r line; do
if [[ $line =~ Anticodon:" "([[:alpha:]]+)" at "([0-9]+) ]]; then
anticodon=${BASH_REMATCH[1]}
start=$(( BASH_REMATCH[2] - 1)) # string indexing is zero-based
elif [[ $line == "Seq: "* ]]; then
seq=${line#Seq: }
printf "Seq: %s, Anticodon: %s\n" "${seq:start-prior:len}" "$anticodon"
fi
done < file
Uma solução mais complexa que analisa a linha "Str:" todas as vezes, mas não codifica o comprimento como 7 (ela codifica o "enésimo" padrão):
8thSeq() {
local seq=$1 str=$2
local last=${str:0:1}
local nth=8 n=1 start
for (( i=1; i < ${#str}; i++)); do
if [[ "${str:i:1}" != "$last" ]]; then
((n++))
if ((n == nth)); then
start=$i
elif ((n == nth+1)); then
echo "${seq:start:i-start}"
break
fi
fi
last=${str:i:1}
done
}
while IFS= read -r line; do
if [[ $line =~ Anticodon:" "([[:alpha:]]+) ]]; then
anticodon=${BASH_REMATCH[1]}
elif [[ $line == "Seq: "* ]]; then
seq=${line#Seq: }
elif [[ $line == "Str: "* ]]; then
str=${line#Str: }
printf "Seq: %s, Anticodon: %s\n" "$(8thSeq "$seq" "$str")" "$anticodon"
fi
done < file
Usando os dados "mais", ambas as soluções geram
Seq: CTCACAC, Anticodon: CAC
Seq: CTGAAGA, Anticodon: GAA
Seq: CTGCCAC, Anticodon: GCC
Seq: TTTACAC, Anticodon: TAC
Seq: CTGATAA, Anticodon: GAT
Seq: CTGATAA, Anticodon: GAT
Seq: CTGATAA, Anticodon: GAT
Seq: CTTCAAA, Anticodon: TCA
Responder3
Supondo que você precise analisar as repetições da string Str:
começar e terminar
Como a sequência de padrões pode mudar para cada bloco, precisamos encontrar uma maneira de encontrar o 8º padrão.
É possível extrair cada "padrão" repetido (da sua descriçãoqualquer coisa que comece com um caractere e termine no mesmo caractere) do str com (GNU) grep:
$ str='>>>>>>>..>>>>.......<<<<.>>>>>.......<<<<<....>>>>>.......<<<<<<<<<<<<.'
$ grep -Eo '(.)\1+' <<<"$str"
>>>>>>>
..
>>>>
.......
<<<<
>>>>>
.......
<<<<<
....
>>>>>
.......
<<<<<<<<<<<<
Portanto, o início e a duração do 8
padrão (usando o shell) são:
pattern=8
splitstr=( $(grep -Eo '(.)\1+' <<<"$str") )
for((i=1;i<=pattern-2;i++)); do
start=$((start+${#splistr[i]}))
done
len=${splitstr[pattern-1]}
Para qualquer padrão (que tenha 8 ou mais repetições).
Ou, mais curto, início e fim:
start=$(echo "$str" | grep -Eo '^((.)\2+|.){7}'); start=${#start}
end=$(echo "$str" | grep -Eo '^((.)\2+|.){8}'); end=${#end}
blocos
No AWK: É possível (e simples) quebrar o arquivo em blocos (linhas separadas por uma linha vazia) configurando RS
como vazio ""
.
Campos
Se RS
cada ""
bloco for dividido em campos automaticamente pelo awk. Sendo o último campo ( $NF
no jargão do awk) o str que contém caracteres repetidos.
Então, no awk:
$ awk -vRS="" '{str=$NF; pat=8
cmd1="echo \"" str "\" | grep -Eo '\''^((.)\\2+|.){" pat-1 "}'\''";
cmd2="echo \"" str "\" | grep -Eo '\''^((.)\\2+|.){" pat "}'\''";
cmd1 | getline start ; close(cmd1) ; start=length(start)
cmd2 | getline end ; close(cmd2) ; end=length(end)
print "Start:",start,"End:",end,"Sequence:",substr($(NF-2),start,end-start),"Anticodon:",$9,"Type:",$7
}' biopattern.txt
Start: 30 End: 37 Sequence: CCTCCCA Anticodon: CCC Type: Gly
Start: 31 End: 38 Sequence: CCTCACA Anticodon: CAC Type: Val
Start: 31 End: 38 Sequence: ACTGAAG Anticodon: GAA Type: Phe
Start: 30 End: 37 Sequence: CCTGCCA Anticodon: GCC Type: Gly
Start: 31 End: 38 Sequence: CTTTACA Anticodon: TAC Type: Val
Start: 32 End: 39 Sequence: GCTGATA Anticodon: GAT Type: Ile
Start: 32 End: 39 Sequence: GCTGATA Anticodon: GAT Type: Ile
Start: 32 End: 39 Sequence: GCTGATA Anticodon: GAT Type: Ile
Start: 33 End: 40 Sequence: GCTTCAA Anticodon: TCA Type: SeC
Quais não são os mesmos resultados de outras respostas baseadas no número após at
.
Talvez: foi isso que você quis dizer?
Responder4
Operando perl
no modo de parágrafo -00
e percorrendo todos os parágrafos, um por um -n
. Primeiro, preenchemos as variáveis type, anticódon, sequência e str observando suas propriedades no para atual, também conhecido como, $_
.
$ perl -n00e '
my($type, $anticodon, $seq, $str) =
/ (?= .*\nType: \h+ (\S+) )
(?= .*\hAnticodon: \h+ (\S+) )
(?= .*\nSeq: \h+ (\S+)$ )
(?= .*\nStr: \h+ (\S+)$ )
/xms;
$str =~ /^((.)\2*){7}((.)\4*)/g;
my($pos_codon, $len_codon) = (pos($str), length($3));
my $codon = substr($seq, $pos_codon-$len_codon, $len_codon);
print "Codon:[$codon] Anticodon:[$anticodon] Type:[$type]\n";
' file
Resultados:
Codon:[CTCACAC] Anticodon:[CAC] Type:[Val]
Codon:[CTGAAGA] Anticodon:[GAA] Type:[Phe]
Codon:[CTGCCAC] Anticodon:[GCC] Type:[Gly]
Codon:[TTTACAC] Anticodon:[TAC] Type:[Val]
Codon:[CTGATAA] Anticodon:[GAT] Type:[Ile]
Codon:[CTGATAA] Anticodon:[GAT] Type:[Ile]
Codon:[CTGATAA] Anticodon:[GAT] Type:[Ile]
Codon:[CTTCAAA] Anticodon:[TCA] Type:[SeC]