Я совсем новичок в командах оболочки 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 стоит того, чтобы его изучить. Обращайтесь с ним хорошо, и он станет вашим другом.