Проблема разделения по разделителю и объединения строк

Проблема разделения по разделителю и объединения строк

Я совсем новичок в командах оболочки Linux. Мне нужно прочитать текстовый файл, содержащий несколько строк, как '!Platform_series_id = GSE1145'. Мне нужно разделить каждую строку, чтобы использовать 'GSE1145' после знака '='. Наконец, я хочу создать ссылку, например, 'ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE5nnn/GSE1145/дополнение/GSE1145_RAW.tar' Выделенные жирным шрифтом части ссылки будут взяты из файла txt. Остальные части постоянны. Вот такая история.

Если я дойду до точки, где я застрял:

Когда я запускаю следующий код

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

Это дает неожиданный результат.

/suppl/.tarcbi.nlm.nih.gov/geo/series/GSE5nnn/ GSE1145 /suppl/.tarcbi.nlm.nih.gov/geo/series/GSE5nnn/ GSE1643

Затем я попробовал просто объединить одну и ту же переменную

while read p; do
  A="$(cut -d'=' -f2 <<<$p)"
  echo "$A$A"
done < a.txt

Но ответ все равно не тот, что я ожидал. Он просто ведет себя так, как написано echo $A.

GSE1145 GSE1643

Чтобы разобраться в проблеме, я наконец попробовал следующий код:

A="$(cut -d'=' -f2 <<< '!Platform_series_id = GSE1145')"
echo $A$A

Это дает мне правильный результат.

GSE1145 GSE1145

Так в чем же проблема, когда я это читаю?

Кстати, когда я пробую следующий код, он работает! Но почему? Я думаю, что это не правильный способ. Если я поставлю столько пробелов, сколько длина $A,

while read p; do
  A="$(cut -d'=' -f2 <<<$p)"
  echo "        $A$A"
done < a.txt

GSE1145 GSE1145 GSE1643 GSE1643

Спасибо за помощь.

решение1

Мне следует разделить каждую строку, чтобы использовать «GSE1145» после знака «=»

Это сигнал, который нужно использовать.awk(1). Его основная идея — читать строки и автоматически их разделять, а вам позволять делать то, что вы хотите. Чтобы awk напечатал вашу ссылку,

awk -F ' += +' \
    '{ printf "ftp://ftp.ncbi.nlm.nih.gov" \
              "/geo/series/GSE5nnn/%s/suppl/%s_RAW.tar", $2, $2 }' filename

Это напечатаетчто-нибудьдля каждой строки в файле. awk позволяет вам выбирать, какие строки обрабатывать и как: либо по номеру строки, либо путем сопоставления с регулярным выражением.

awk стоит того, чтобы его изучить. Обращайтесь с ним хорошо, и он станет вашим другом.

Связанный контент