Tengo un archivo de texto que tiene varias filas. Estoy usando el comando while para leer el archivo en líneas, pero necesito almacenar los valores en variables separadas y usarlos en el script de shell final.
ElcortarEl comando delimita el archivo completo, no la línea de lectura.
Ejemplo my_file.txt
:
d1:jobid1
id2:jobid2
Estoy usando el bucle while a continuación para leer el archivo en líneas.
while IFS= read -r line; do
jobid=`cut -d: -f2`
id=`cut -d: -f1`
#remaining shell-script dependent upon variables#
done < my_file.txt
Quiero almacenar el ID de trabajo y la identificación de cada línea my_file.txt
y ejecutar el script final.Cada línea está en una nueva línea.
Necesita ayuda para almacenar los valores en las variables de forma recursiva. Si hay una mejor manera de leer líneas y delimitar y almacenar los dos campos por separado.
Respuesta1
cut
lee desde la entrada estándar de forma predeterminada. En su sustitución de comando, la entrada estándar se hereda de la entrada estándar del bucle (ya que no proporciona ninguna otra entrada explícita para las llamadas a cut
). La entrada estándar del bucle proviene de su archivo de entrada.
El efecto es que la primera línea de su archivo es leída por read
, mientras que todas las demás líneas son leídas por la primera llamada a cut
. Por lo tanto , el valor de la jobid
variable sería una cadena de ID de trabajo delimitada por una nueva línea, mientras que la id
variable estaría vacía. El bucle ejecutaría una única iteración.
Túpodría utilizar, Por ejemplo,
id=$( printf '%s\n' "$line" | cut -d: -f1 )
# or: id=$( cut -d: -f1 <<<"$line" )
# (in shells that supports "here-strings")
pero eso sería innecesario ya que sería más limpio y mucho más eficiente hacerlo
while IFS=: read -r id jobid; do
# code that uses "$id" and "$jobid" goes here
done <my_file.txt
Esto aprovecha el hecho de que read
puede leer datos de una línea de entrada en múltiples variables a la vez. Al establecer IFS
dos puntos, la línea se divide en los dos puntos y se lee el primer campo id
mientras que el resto se lee jobid
. No es necesario llamar cut
en absoluto.