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