Problem beim Aufteilen nach Trennzeichen und Verketten von Zeichenfolgen

Problem beim Aufteilen nach Trennzeichen und Verketten von Zeichenfolgen

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.

verwandte Informationen