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.