Dividido por problema de cadeia delimitadora e concatenada

1

Eu sou muito novo com comandos shell do Linux. Eu 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 da parte do sinal '='. Por fim, quero produzir um link como " ftp://ftp.ncbi.nlm.nih.gov / geo / series / GSE5nnn / GSE1145 / supl / GSE1145 _RAW.tar ' As partes em negrito do link serão tiradas do arquivo txt. As partes restantes são constantes. Essa foi a história.

Se eu chegar ao ponto em que fiquei preso:

Quando eu corro 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 espero. Apenas se comporta como está escrito eco $ 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 o leio?

A propósito, quando tento seguir o código, funciona! Mas por que? Eu acho que isso não é o caminho correto. Se eu colocar espaços como o comprimento do $ A,

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

GSE1145 GSE1145  GSE1643 GSE1643

Obrigado por ajuda.

    
por ykpemre 23.11.2017 / 00:39

1 resposta

2

I should split each line to use 'GSE1145' after the '=' sign

Esse é um sinal para usar o awk (1). Sua idéia básica é ler linhas e dividi-las automaticamente, e deixar 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 imprimirá algo para cada linha no arquivo. O awk permite escolher quais linhas processar como, por número de linha ou por correspondência com uma expressão regular.

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

    
por 23.11.2017 / 03:09