![principio y fin](https://rvso.com/image/164699/principio%20y%20fin.png)
Tengo los siguientes bloques de datos (múltiples)
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 bloque, necesito encontrar el octavo patrón en la última línea del bloque que comienza con Str
. En el caso anterior, el octavo patrón es .......
(7 períodos). Esto se debe a que el primer conjunto de >
símbolos forma un patrón, el segundo conjunto de períodos forma un segundo patrón y así sucesivamente.
Ahora necesito extraer esos 7 caracteres de la Seq
línea directamente encima de la línea del patrón. En el ejemplo esto corresponde a la subsecuencia CTCCCAC
.
La salida debe serSeq is CTCCCAC and Anticodon: CCC
¿Es esto posible en bash
cualquier shell?
Más ejemplos de los bloques de datos.
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: >>>>>>>.>..>>>>>>....<<<<<<<<<<<<.......<<<<<<.>>>>>....<<<<<.>>>>.......<<<<<.<<<<<<<.
Respuesta1
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
¿Dónde script.awk
está el siguiente 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
}
El primer bloque se activa con cualquier línea que comience con la cadena Type:
y selecciona el tipo y la secuencia del anticodón del segundo y cuarto campos delimitados por espacios en blanco y divide el sexto campo -
para producir las coordenadas de inicio y fin de la secuencia.
El segundo bloque se activa con una línea que comienza con la cadena Seq:
y selecciona la secuencia del segundo campo delimitado por espacios en blanco utilizando la posición inicial del anticodón y la longitud del anticodón leída de la última Type:
línea, asegurándose de obtener un par de bases. -pares a cada lado.
Luego se produce la salida.
El siguiente sed
script utiliza el octavo "patrón" de la Str:
línea para extraer la secuencia deseada en lugar de las posiciones numéricas del anticodón dadas en la Type:
línea.
/^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
(el final d
no es un error tipográfico).
Lo hace en dos pasadas.
En la primera pasada, se crean dos archivos nuevos data.tmp
y pass2.sed
.
$ sed -f script.sed file
(no hay salida de terminal de esto)
Para los datos dados, data.tmp
se verá así
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
es un sed
script que postprocesa esto:
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ..............................\(.......\)[^,]*/: \1/;n
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: .................................\(.......\)[^,]*/: \1/;n
Aplicar pass2.sed
sobre data.sed
te da el 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
Nota: No estoy seguro de cómo funciona el segundo pasomuygrandes conjuntos de datos.
Respuesta2
Dado que podemos extraer el índice inicial junto con el anticodón:
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
Una solución más compleja que analiza la línea "Str:" cada vez, pero no codifica la longitud como 7 (sí codifica el patrón "nth"):
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 los datos "más", ambas soluciones generan
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
Respuesta3
Suponiendo que necesita analizar las repeticiones de la cadena Str:
principio y fin
Dado que la secuencia de patrones podría cambiar para cada bloque, necesitamos una manera de encontrar el octavo patrón.
Es posible extraer cada "patrón" repetido (de su descripciónCualquier cosa que comience con un carácter y termine con el mismo carácter.) de la cadena con (GNU) grep:
$ str='>>>>>>>..>>>>.......<<<<.>>>>>.......<<<<<....>>>>>.......<<<<<<<<<<<<.'
$ grep -Eo '(.)\1+' <<<"$str"
>>>>>>>
..
>>>>
.......
<<<<
>>>>>
.......
<<<<<
....
>>>>>
.......
<<<<<<<<<<<<
Entonces, el inicio y la duración del 8
patrón (usando el caparazón) es:
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 cualquier patrón (que tenga 8 o más repeticiones).
O, más brevemente, inicio y fin:
start=$(echo "$str" | grep -Eo '^((.)\2+|.){7}'); start=${#start}
end=$(echo "$str" | grep -Eo '^((.)\2+|.){8}'); end=${#end}
bloques
En AWK: es posible (y sencillo) dividir el archivo en bloques (líneas separadas por una línea vacía) configurándolo RS
en vacío ""
.
campos
Si RS
es así, ""
cada bloque se divide en campos automáticamente mediante awk. Siendo el último campo ( $NF
en lenguaje awk) el str que contiene caracteres repetidos.
Entonces, en 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
Que no son los mismos resultados de otras respuestas basadas en el número posterior at
.
Quizás: ¿Es esto lo que quisiste decir?
Respuesta4
Operar perl
en el modo de párrafo -00
y recorrer todos los párrafos uno por uno -n
. Primero completamos las variables tipo, anticodón, secuencia y cadena observando sus propiedades en el párrafo actual, también conocido 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]