Cuando ejecuto un comando, obtengo 10 líneas de salida. Quiero tomar las líneas 2-4-6-8-10 y ponerlas en una matriz.
Cada vez que ejecuto mi comando, el orden cambia, por lo que debo hacerlo de una sola vez. Intenté ejecutar mi comando y seleccionar la línea 2, luego ejecutarlo nuevamente y seleccionar la línea 4, etc., pero debido a que el orden cambia, esto no funciona:
value1=$(my_command |sed '2q;d')
value2=$(my_command |sed '4q;d')
value3=$(my_command |sed '6q;d')
value4=$(my_command |sed '8q;d')
value5=$(my_command |sed '10q;d')
MY_ARRAY=("${value1}" "${value2}" "${value3}" "${value4}" "${value5}")
Respuesta aceptada:
Usando readarray
en el bash
shell y GNU sed
:
readarray -t my_array < <( my_command | sed '1~2d' )
El readarray
incorporado lee las líneas en una matriz. Las líneas se leen de una sustitución de proceso. El sed
el comando en la sustitución del proceso solo generará cada segunda línea leída de my_command
(y también podría escribirse sed '1!n;d'
, o como sed -n 'n;p'
con sed
estándar ).
En GNU sed
, la dirección n~m
direcciones cada m
:ésima línea que comienza en la línea n
. Esta es una extensión GNU para sed
estándar , para mayor comodidad.
El my_command
el comando solo se llamará una vez.
Prueba:
$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10