Eu sou muito novo com os comandos shell do Linux. Eu preciso ler um arquivo de texto que contém várias linhas como '!Platform_series_id = GSE1145'. Devo dividir cada linha para usar ' GSE1145 ' após a parte do sinal '=' dela. Por fim, desejo produzir um link como ' ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE5nnn/ GSE1145 /suppl/ 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 eu 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 eu 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 o leio?
A propósito, quando tento seguir o código, funciona! Mas por que? Acho que essa não é a forma correta. Se eu colocar espaços iguais ao tamanho do $A,
while read p; do
A="$(cut -d'=' -f2 <<<$p)"
echo " $A$A"
done < a.txt
GSE1145 GSE1145 GSE1643 GSE1643
Obrigado pela ajuda.
Isso é um sinal para usar o awk (1). Sua ideia básica é ler linhas e dividi-las automaticamente, e deixar você fazer o que quiser. Para fazer o awk imprimir seu link,
Isso imprimirá algo para cada linha do arquivo. O awk permite que você escolha quais linhas processar, seja pelo número da linha ou pela correspondência de uma expressão regular.
vale a pena aprender awk. Trate-o bem e ele será seu amigo.