dividir línea usando delimitador y almacenar ambos campos en una variable diferente

dividir línea usando delimitador y almacenar ambos campos en una variable diferente

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

cutlee 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 jobidvariable sería una cadena de ID de trabajo delimitada por una nueva línea, mientras que la idvariable estaría vacía. El bucle ejecutaría una única iteración.

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 readpuede leer datos de una línea de entrada en múltiples variables a la vez. Al establecer IFSdos puntos, la línea se divide en los dos puntos y se lee el primer campo idmientras que el resto se lee jobid. No es necesario llamar cuten absoluto.

información relacionada