Problema de división por delimitador y concatenación de cadenas

Problema de división por delimitador y concatenación de cadenas

Soy muy nuevo con los comandos de shell de Linux. Necesito leer un archivo de texto que contiene varias líneas como '!Platform_series_id = GSE1145'. Debería dividir cada línea para usar 'GSE1145' después de la parte del signo '=". Finalmente quiero producir un enlace como 'ftp://ftp.ncbi.nlm.nih.gov/geo/series/GSE5nnn/GSE1145/suplemento/GSE1145_RAW.tar' Las partes en negrita del enlace se tomarán del archivo txt. Las partes restantes son constantes. Esta fue la historia.

Si llego al punto en el que me quedé atascado:

Cuando ejecuto el siguiente 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

Da un resultado inesperado

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

Luego intenté simplemente concatenar la misma variable.

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

Pero aún así la respuesta no es la que esperaba. Simplemente se comporta tal como está escrito echo $A.

GSE1145 GSE1643

Para entender el problema, finalmente probé el siguiente código:

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

Me da un resultado correcto

GSE1145 GSE1145

Entonces, ¿cuál es el problema cuando lo leo?

Por cierto, cuando intento seguir el código, ¡funciona! ¿Pero por qué? Creo que esta no es la forma correcta. Si pongo tantos espacios como la longitud de $A,

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

GSE1145 GSE1145 GSE1643 GSE1643

Gracias por la ayuda.

Respuesta1

Debería dividir cada línea para usar 'GSE1145' después del signo '="

Esa es una señal para usar.awk(1). Su idea básica es leer líneas y dividirlas automáticamente, y dejarte hacer lo que quieras. Para hacer que awk imprima su enlace,

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

eso se imprimiráalgopara cada línea del archivo. awk le permite elegir qué líneas procesar y cómo, ya sea por número de línea o haciendo coincidir una expresión regular.

Vale la pena aprender awk. Trátalo bien y será tu amigo.

información relacionada