¿Cómo puedo iterar por cada línea de un archivo de texto con Bash?
Con este script:
echo "Start!"
for p in (peptides.txt)
do
echo "${p}"
done
Obtengo esta salida en la pantalla:
Start!
./runPep.sh: line 3: syntax error near unexpected token `('
./runPep.sh: line 3: `for p in (peptides.txt)'
(Más tarde quiero hacer algo más complicado con $p
que simplemente la salida a la pantalla).
La variable de entorno SHELL es (de env):
SHELL=/bin/bash
/bin/bash --version
salida:
GNU bash, version 3.1.17(1)-release (x86_64-suse-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
cat /proc/version
output:
Linux version 2.6.18.2-34-default (geeko@buildhost) (gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)) #1 SMP Mon Nov 27 11:46:27 UTC 2006
El archivo peptides.txt contiene:
RKEKNVQ
IPKKLLQK
QYFHQLEKMNVK
IPKKLLQK
GDLSTALEVAIDCYEK
QYFHQLEKMNVKIPENIYR
RKEKNVQ
VLAKHGKLQDAIN
ILGFMK
LEDVALQILL
Una forma de hacerlo es:
while read p; do
echo "$p"
done <peptides.txt
Como se señala en los comentarios, esto tiene los efectos secundarios de recortar los espacios en blanco iniciales, interpretar las secuencias de barras invertidas y omitir la última línea si falta un salto de línea final. Si esto le preocupa, puede hacerlo:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Excepcionalmente, si el cuerpo del bucle puede leer de la entrada estándar, puede abrir el archivo utilizando un descriptor de archivo diferente:
while read -u 10 p; do
...
done 10<peptides.txt
Aquí, 10 es sólo un número arbitrario (diferente de 0, 1, 2).
cat peptides.txt | while read line
do
# do something with $line here
done
y la variante de una línea:
cat peptides.txt | while read line; do something_with_$line_here; done
Estas opciones omitirán la última línea del archivo si no hay un avance de línea final.
Puede evitarlo de la siguiente manera:
cat peptides.txt | while read line || [[ -n $line ]];
do
# do something with $line here
done
Opción 1a: Bucle while: Una sola línea a la vez: Redirección de entrada
#!/bin/bash
filename='peptides.txt'
echo Start
while read p; do
echo $p
done < $filename
Opción 1b: Bucle while: Una sola línea a la vez: Abre el archivo, lee desde un descriptor de archivo (en este caso el descriptor de archivo #4).
#!/bin/bash
filename='peptides.txt'
exec 4<$filename
echo Start
while read -u4 p ; do
echo $p
done