Ich habe folgende Datenblöcke (mehrere)
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: >>>>>>>..>>>>.......<<<<.>>>>>.......<<<<<....>>>>>.......<<<<<<<<<<<<.
Für jeden Block muss ich das 8. Muster in der letzten Zeile des Blocks finden, das mit beginnt Str
. Im obigen Fall ist das 8. Muster .......
(7 Perioden). Dies liegt daran, dass der erste Symbolsatz >
ein Muster ergibt, der zweite Periodensatz ein zweites Muster und so weiter.
Nun muss ich diese 7 Zeichen aus der Seq
Zeile direkt über der Musterzeile extrahieren. Im Beispiel entspricht dies der Teilsequenz CTCCCAC
.
Die Ausgabe sollteSeq is CTCCCAC and Anticodon: CCC
Ist dies in bash
einer oder mehreren Shells möglich?
Weitere Beispiele für die Datenblöcke
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: >>>>>>>.>..>>>>>>....<<<<<<<<<<<<.......<<<<<<.>>>>>....<<<<<.>>>>.......<<<<<.<<<<<<<.
Antwort1
Verwendung von 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
Wo script.awk
ist folgendes awk
Programm:
/^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
}
Der erste Block wird durch eine beliebige Zeile ausgelöst, die mit der Zeichenfolge beginnt. Type:
Er wählt den Typ und die Antikodon-Sequenz aus dem zweiten und vierten durch Leerzeichen getrennten Feld aus und teilt das sechste Feld dieser Art auf, -
um die Start- und Endkoordinaten in der Sequenz zu erzeugen.
Der zweite Block wird durch eine Zeile ausgelöst, die mit der Zeichenfolge beginnt Seq:
, und wählt die Sequenz aus dem zweiten durch Leerzeichen getrennten Feld aus. Dabei verwendet er die Startposition des Antikodons und die Länge des Antikodons, die aus der letzten Type:
Zeile gelesen wurde. Dabei wird sichergestellt, dass auf beiden Seiten ein paar Basenpaare vorhanden sind.
Anschließend wird die Ausgabe erstellt.
Das folgende sed
Skript verwendet das 8. „Muster“ aus der Str:
Zeile, um die gewünschte Sequenz zu extrahieren, und nicht die in der Type:
Zeile angegebenen numerischen Positionen für das Anticodon.
/^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
(das Nachstellen d
ist kein Tippfehler).
Dies geschieht in zwei Durchgängen.
Im ersten Durchgang werden zwei neue Dateien erstellt, data.tmp
und pass2.sed
.
$ sed -f script.sed file
(es gibt hiervon keine Terminalausgabe)
Für die angegebenen Daten data.tmp
sieht es so aus:
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
ist ein sed
Skript, das dies nachbearbeitet:
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ..............................\(.......\)[^,]*/: \1/;n
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: .................................\(.......\)[^,]*/: \1/;n
Durch die Anwendung pass2.sed
auf data.sed
erhalten Sie das Endergebnis:
$ 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
Hinweis: Ich bin nicht sicher, wie der zweite Schritt funktioniert aufsehrgroße Datensätze.
Antwort2
Vorausgesetzt, wir können den Startindex zusammen mit dem Antikodon extrahieren:
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
Eine komplexere Lösung, die die Zeile „Str:“ jedes Mal analysiert, die Länge aber nicht als 7 fest codiert (das „n-te“ Muster wird jedoch fest codiert):
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
Mit den „mehr“ Daten geben beide Lösungen aus
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
Antwort3
Angenommen, Sie müssen die Wiederholungen der Zeichenfolge Str analysieren:
Beginn und Ende
Da sich die Mustersequenz für jeden Block ändern kann, benötigen wir eine Möglichkeit, das 8. Muster zu finden.
Es ist möglich, jedes wiederholte "Muster" (aus Ihrer Beschreibung) zu extrahierenalles, was mit einem Zeichen beginnt und mit demselben Zeichen endet) aus dem str mit (GNU) grep:
$ str='>>>>>>>..>>>>.......<<<<.>>>>>.......<<<<<....>>>>>.......<<<<<<<<<<<<.'
$ grep -Eo '(.)\1+' <<<"$str"
>>>>>>>
..
>>>>
.......
<<<<
>>>>>
.......
<<<<<
....
>>>>>
.......
<<<<<<<<<<<<
Der Anfang und die Länge des 8
Musters (unter Verwendung der Shell) lauten also:
pattern=8
splitstr=( $(grep -Eo '(.)\1+' <<<"$str") )
for((i=1;i<=pattern-2;i++)); do
start=$((start+${#splistr[i]}))
done
len=${splitstr[pattern-1]}
Für jedes Muster (mit 8 oder mehr Wiederholungen).
Oder kürzer: Anfang und Ende:
start=$(echo "$str" | grep -Eo '^((.)\2+|.){7}'); start=${#start}
end=$(echo "$str" | grep -Eo '^((.)\2+|.){8}'); end=${#end}
Blöcke
In AWK: Es ist möglich (und einfach), die Datei in Blöcke (Zeilen, die durch eine leere Zeile getrennt sind) aufzuteilen, indem Sie sie RS
auf „leer“ setzen ""
.
Felder
Dabei RS
wird ""
jeder Block von awk automatisch weiter in Felder unterteilt. Das letzte Feld ( $NF
in der awk-Sprache) ist der String, der wiederholte Zeichen enthält.
Also, in 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
Dies sind nicht die gleichen Ergebnisse wie bei anderen Antworten, basierend auf der Zahl danach at
.
Vielleicht: Ist es das, was Sie gemeint haben?
Antwort4
Wir arbeiten perl
im Absatzmodus -00
und durchlaufen nacheinander alle Absätze -n
. Zuerst füllen wir die Variablen Typ, Antikodon, Sequenz und Str aus, indem wir uns ihre Eigenschaften im aktuellen Absatz ansehen, auch bekannt als $_
.
$ 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
Ergebnisse:
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]