Wenn ich einen Befehl ausführe, erhalte ich 10 Zeilen Ausgabe. Ich möchte die Zeilen 2-4-6-8-10 nehmen und sie in ein Array einfügen.
Jedes Mal, wenn ich meinen Befehl ausführe, ändert sich die Reihenfolge, sodass ich dies auf einmal tun muss. Ich hatte versucht, meinen Befehl auszuführen und Zeile 2 auszuwählen, dann erneut auszuführen und Zeile 4 auszuwählen usw., aber da sich die Reihenfolge ändert, funktioniert dies nicht:
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}")
Akzeptierte Antwort:
Verwenden von readarray
in der bash
Shell und GNU sed
:
readarray -t my_array < <( my_command | sed '1~2d' )
Das eingebaute readarray
liest die Zeilen in ein Array ein. Die Zeilen werden aus einer Prozesssubstitution gelesen. Der sed
command in der Prozesssubstitution gibt nur jede zweite Zeile aus, die von my_command
gelesen wird (und könnte auch sed '1!n;d'
geschrieben werden , oder als sed -n 'n;p'
mit Standard-sed
).
In GNU sed
, die Adresse n~m
adressiert jeden m
:te Zeile ab Zeile n
. Dies ist eine GNU-Erweiterung des Standard-sed
, der Einfachheit halber.
Der my_command
Befehl wird immer nur einmal aufgerufen.
Testen:
$ readarray -t my_array < <( seq 10 | sed '1~2d' )
$ printf '%s\n' "${my_array[@]}"
2
4
6
8
10