Quando eseguo un comando, ottengo 10 righe di output. Voglio prendere le righe 2-4-6-8-10 e inserirle in un array.
Ogni volta che eseguo il mio comando, l'ordine cambia, quindi devo farlo in una volta sola. Avevo provato a eseguire il mio comando e selezionare la riga 2, quindi eseguire di nuovo e selezionare la riga 4 ecc., ma poiché l'ordine cambia, questo non funziona:
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}")
Risposta accettata:
Usando readarray
nel bash
shell e GNU sed
:
readarray -t my_array < <( my_command | sed '1~2d' )
Il readarray
integrato legge le righe in un array. Le righe vengono lette da una sostituzione di processo. Il sed
comando nella sostituzione del processo produrrà solo ogni seconda riga letta da my_command
(e potrebbe anche essere scritto sed '1!n;d'
o come sed -n 'n;p'
con sed
standard ).
In GNU sed
, l'indirizzo n~m
indirizzi ogni m
:esima riga che inizia alla riga n
. Questa è un'estensione GNU dello standard sed
, per comodità.
Il my_command
il comando verrà chiamato solo una volta.
Test:
$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10