Setelah banyak percobaan dan kesalahan saya benar-benar menemukan array multidimensi terbaik, paling jelas dan termudah di bash adalah dengan menggunakan var biasa. Ya.
Keuntungan: Anda tidak perlu mengulang array yang besar, Anda cukup echo "$var" dan menggunakan grep/awk/sed. Mudah dan jelas dan Anda dapat memiliki kolom sebanyak yang Anda suka.
Contoh:
$ var=$(echo -e 'kris hansen oslo\nthomas jonson peru\nbibi abu johnsonville\njohnny lipp peru')
$ echo "$var"
kris hansen oslo
thomas johnson peru
bibi abu johnsonville
johnny lipp peru
Jika Anda ingin menemukan semua orang di peru
$ echo "$var" | grep peru
thomas johnson peru
johnny lipp peru
Hanya grep(sed) di bidang ketiga
$ echo "$var" | sed -n -E '/(.+) (.+) peru/p'
thomas johnson peru
johnny lipp peru
Jika Anda hanya ingin bidang x
$ echo "$var" | awk '{print $2}'
hansen
johnson
abu
johnny
Semua orang di Peru memanggil Thomas dan mengembalikan nama belakangnya
$ echo "$var" |grep peru|grep thomas|awk '{print $2}'
johnson
Pertanyaan apa pun yang dapat Anda pikirkan... sangat mudah.
Untuk mengubah item:
$ var=$(echo "$var"|sed "s/thomas/pete/")
Untuk menghapus baris yang berisi "x"
$ var=$(echo "$var"|sed "/thomas/d")
Untuk mengubah bidang lain di baris yang sama berdasarkan nilai dari item lain
$ var=$(echo "$var"|sed -E "s/(thomas) (.+) (.+)/\1 test \3/")
$ echo "$var"
kris hansen oslo
thomas test peru
bibi abu johnsonville
johnny lipp peru
Tentu saja perulangan juga berfungsi jika Anda ingin melakukannya
$ for i in "$var"; do echo "$i"; done
kris hansen oslo
thomas jonson peru
bibi abu johnsonville
johnny lipp peru
Satu-satunya hal yang saya temukan dengan ini adalah Anda harus selalu mengutip var (dalam contoh; var dan i) atau semuanya akan terlihat seperti ini
$ for i in "$var"; do echo $i; done
kris hansen oslo thomas jonson peru bibi abu johnsonville johnny lipp peru
dan seseorang pasti akan mengatakan itu tidak akan berfungsi jika Anda memiliki spasi di masukan Anda, namun hal itu dapat diperbaiki dengan menggunakan pembatas lain di masukan Anda, misalnya (menggunakan karakter utf8 sekarang untuk menekankan bahwa Anda dapat memilih sesuatu yang tidak akan dipilih oleh masukan Anda berisi, tetapi Anda dapat memilih apa saja):
$ var=$(echo -e 'field one☥field two hello☥field three yes moin\nfield 1☥field 2☥field 3 dsdds aq')
$ for i in "$var"; do echo "$i"; done
field one☥field two hello☥field three yes moin
field 1☥field 2☥field 3 dsdds aq
$ echo "$var" | awk -F '☥' '{print $3}'
field three yes moin
field 3 dsdds aq
$ var=$(echo "$var"|sed -E "s/(field one)☥(.+)☥(.+)/\1☥test☥\3/")
$ echo "$var"
field one☥test☥field three yes moin
field 1☥field 2☥field 3 dsdds aq
Jika Anda ingin menyimpan baris baru di masukan Anda, Anda dapat mengonversi baris baru menjadi baris lain sebelum masukan dan mengonversinya kembali pada keluaran (atau jangan gunakan bash...). Menikmati!
person
n00p
schedule
25.04.2017