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 salto de línea final.
Puede evitar esto 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:
Abra el archivo, lea 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
Esto no es mejor que otras respuestas, pero es una forma más de hacer el trabajo en un archivo sin espacios (ver comentarios). Encuentro que a menudo necesito frases ingeniosas para buscar en las listas de los archivos de texto sin el paso adicional de usar archivos de secuencias de comandos independientes.
for word in $(cat peptides.txt); do echo $word; done
Este formato me permite ponerlo todo en una línea de comandos. Cambie la parte "echo $palabra" a lo que desee y podrá emitir varios comandos separados por punto y coma. El siguiente ejemplo usa el contenido del archivo como argumentos en otros dos scripts que puede haber escrito.
for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done
O si tiene la intención de usar esto como un editor de flujo (aprender sed), puede volcar la salida a otro archivo de la siguiente manera.
for word in $(cat peptides.txt); do cmd_a.sh $word; cmd_b.py $word; done > outfile.txt
Los he usado como están escritos arriba porque he usado archivos de texto donde los he creado con una palabra por línea. (Ver comentarios) Si tiene espacios en los que no desea dividir sus palabras/líneas, se vuelve un poco más feo, pero el mismo comando aún funciona de la siguiente manera:
OLDIFS=$IFS; IFS=$'\n'; for line in $(cat peptides.txt); do cmd_a.sh $line; cmd_b.py $line; done > outfile.txt; IFS=$OLDIFS
Esto solo le dice al shell que se divida solo en líneas nuevas, no en espacios, luego devuelve el entorno a lo que era anteriormente. Sin embargo, en este punto, es posible que desee considerar ponerlo todo en un script de shell en lugar de comprimirlo todo en una sola línea.
¡Mucha suerte!
Una forma de hacerlo es:
while read p; do
echo "$p"
done <peptides.txt
Como se señaló en los comentarios, esto tiene los efectos secundarios de recortar los espacios en blanco iniciales, interpretar las secuencias de barra invertida y omitir la última línea si falta un salto de línea de terminación. Si estas son preocupaciones, puede hacer:
while IFS="" read -r p || [ -n "$p" ]
do
printf '%s\n' "$p"
done < peptides.txt
Excepcionalmente, si el cuerpo del ciclo puede leerse desde la entrada estándar, puede abrir el archivo usando un descriptor de archivo diferente:
while read -u 10 p; do
...
done 10<peptides.txt
Aquí, 10 es solo un número arbitrario (diferente de 0, 1, 2).