Ich bin sehr neu mit Linux-Shell-Befehlen. Ich muss eine Textdatei lesen, die mehrere Zeilen wie '!Platform_series_id = GSE1145' enthält. Ich sollte jede Zeile aufteilen, um 'GSE1145' nach dem '='-Zeichen. Schließlich möchte ich einen Link wie 'ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE5nnn/GSE1145/Ergänzung/GSE1145_RAW.tar‘ Die fettgedruckten Teile des Links werden aus der txt-Datei übernommen. Die restlichen Teile bleiben unverändert. Das war die Geschichte.
Wenn ich an den Punkt komme, an dem ich nicht mehr weiterkomme:
Wenn ich den folgenden Code ausführe
while read p; do
A="$(cut -d'=' -f2 <<<$p)"
echo "ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE5nnn/$A/suppl/$A_RAW.tar"
done < a.txt
Es gibt ein unerwartetes Ergebnis
/suppl/.tarcbi.nlm.nih.gov/geo/series/GSE5nnn/ GSE1145 /suppl/.tarcbi.nlm.nih.gov/geo/series/GSE5nnn/ GSE1643
Dann habe ich versucht, einfach die gleiche Variable zu verketten
while read p; do
A="$(cut -d'=' -f2 <<<$p)"
echo "$A$A"
done < a.txt
Aber die Antwort ist immer noch nicht das, was ich erwarte. Es verhält sich einfach so, wie es geschrieben steht: echo $A.
GSE1145 GSE1643
Um das Problem zu verstehen, habe ich schließlich den folgenden Code ausprobiert:
A="$(cut -d'=' -f2 <<< '!Platform_series_id = GSE1145')"
echo $A$A
Es gibt mir ein korrektes Ergebnis
GSE1145 GSE1145
Was ist also das Problem, wenn ich es lese?
Übrigens, wenn ich den folgenden Code ausprobiere, funktioniert es! Aber warum? Ich denke, das ist nicht der richtige Weg. Wenn ich so viele Leerzeichen wie die Länge von $A einfüge,
while read p; do
A="$(cut -d'=' -f2 <<<$p)"
echo " $A$A"
done < a.txt
GSE1145 GSE1145 GSE1643 GSE1643
Danke für die Hilfe.
Antwort1
Ich sollte jede Zeile aufteilen, um nach dem =-Zeichen ‚GSE1145‘ zu verwenden.
Das ist ein Signal, das man nutzen sollteawk(1). Die Grundidee besteht darin, Zeilen zu lesen und automatisch aufzuteilen, sodass Sie tun können, was Sie wollen. Damit awk Ihren Link ausdruckt,
awk -F ' += +' \
'{ printf "ftp://ftp.ncbi.nlm.nih.gov" \
"/geo/series/GSE5nnn/%s/suppl/%s_RAW.tar", $2, $2 }' filename
Das wird gedrucktetwasfür jede Zeile in der Datei. Mit awk können Sie auswählen, welche Zeilen wie verarbeitet werden sollen, entweder nach Zeilennummer oder durch Abgleichen eines regulären Ausdrucks.
Es lohnt sich, awk zu lernen. Behandeln Sie es gut und es wird Ihr Freund sein.