Problema de divisão por delimitador e concatenação de string

Problema de divisão por delimitador e concatenação de string

Eu sou muito novo com comandos shell do Linux. Preciso ler um arquivo de texto que contém várias linhas como '!Platform_series_id = GSE1145'. Eu deveria dividir cada linha para usar 'GSE1145'depois do sinal '=' parte dele. Finalmente, quero produzir um link como 'ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE5nnn/GSE1145/fornecimento/GSE1145_RAW.tar' As partes em negrito do link serão retiradas do arquivo txt. As partes restantes são constantes. Esta foi a história.

Se eu chegar ao ponto em que fiquei preso:

Quando executo o seguinte código

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

Dá um resultado inesperado

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

Então tentei simplesmente concatenar a mesma variável

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

Mas ainda assim a resposta não é o que eu esperava. Ele apenas se comporta como está escrito echo $A.

GSE1145 GSE1643

Para entender o problema, finalmente tentei o seguinte código:

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

Isso me dá um resultado correto

GSE1145 GSE1145

Então, qual é o problema quando eu leio isso?

A propósito, quando tento seguir o código, funciona! Mas por que? Acho que esse não é o caminho correto. Se eu colocar espaços iguais ao comprimento de $A,

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

GSE1145 GSE1145 GSE1643 GSE1643

Obrigado pela ajuda.

Responder1

Devo dividir cada linha para usar 'GSE1145' após o sinal '='

Esse é um sinal para usarestranho(1). Sua ideia básica é ler as linhas e dividi-las automaticamente, deixando você fazer o que quiser. Para fazer o awk imprimir seu link,

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

Isso vai imprimiralgopara cada linha do arquivo. O awk permite que você escolha quais linhas serão processadas, seja pelo número da linha ou pela correspondência de uma expressão regular.

awk vale a pena aprender. Trate-o bem e ele será seu amigo.

informação relacionada