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.