GNU/Linux >> Tutoriales Linux >  >> Linux

Recorriendo el contenido de un archivo en Bash

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).


Linux
  1. ¿Ejecutando un archivo de script sobre Ssh a través de Sudo?

  2. ¿Guardar toda la salida del terminal en un archivo?

  3. ¿Cómo ver el contenido de una copia de seguridad del archivo de base de datos Dconf?

  4. ¿Cómo sé el nombre del archivo de script en un script Bash?

  5. Recorriendo los elementos de una variable de ruta en Bash

5 comandos para ver el contenido de un archivo en la línea de comandos de Linux

Imprima un archivo, omitiendo las primeras líneas X, en Bash

Bash:agregue una cadena al final del archivo sin salto de línea

¿Cómo verificar si un archivo está vacío en Bash?

¿Cómo obtengo el directorio absoluto de un archivo en bash?

¿Cómo se comprime un archivo y se conserva el archivo .gz?