Me gustaría leer diferentes líneas de un archivo de texto a diferentes variables. Por ejemplo
input.txt
:
line1 foo foobar bar
line2 bar
line3 foo
line4 foobar bar
Quiero que este resultado se almacena en las variables var1
, var2
, var3
y var4
de tal manera que
var1=line1 foo foobar bar
var2=line2 bar
y así.
¿Podría alguien decirme cómo se hace? Traté de usar eval
en un bucle for. No parece funcionar.
grep
,cut
, et. Al.), es mucho mejor hacer lo que necesita hacer. No microgestión en un script de shell; orquestar herramientas para hacer el trabajo.Respuestas:
Tu harías:
O:
(menos eficiente ya
line
que rara vez está incorporado y la mayoría de los shells necesitan bifurcarse para implementar la sustitución de comandos.line
Tampoco es un comando estándar).Para usar un bucle:
O para definir automáticamente los nombres de las variables como
line<++n>
:Tenga en cuenta que
bash
admite variables de matriz y una funciónreadarray
integrada para leer líneas en una matriz:Sin embargo , tenga en cuenta que, a diferencia de la mayoría de los otros shells, los
bash
índices de matriz comienzan en 0, no en 1 (heredado deksh
), por lo que la primera línea estará en${line[0]}
, no${line[1]}
(aunque, como ha demostrado @Costas , puede hacerreadarray
(también conocido comomapfile
) comience a escribir los valores en el índice 1 (lasbash
matrices también son contrarias a que la mayoría de las otras capas sean matrices dispersas ) con-O 1
).Ver también: ¿ Entender "IFS = read -r line"?
fuente
Ofrecería usar una matriz para tales tareas
así que tendrás cada línea adentro
${var[1]}
,${var[2]}
y así sucesivamentefuente
Esto no es estrictamente lo que solicitó, pero podría funcionar para sus necesidades. Puede serializar los datos con Awk. Tenga en cuenta que esto se romperá si su $ 1 no es un nombre de variable válido:
Resultado:
fuente