หลังจากการลองผิดลองถูกมาหลายครั้ง ฉันพบว่าอาร์เรย์หลายมิติที่ดีที่สุด ชัดเจนที่สุด และง่ายที่สุดบน bash คือการใช้ var ปกติ ใช่.
ข้อดี: คุณไม่จำเป็นต้องวนซ้ำอาร์เรย์ขนาดใหญ่ คุณสามารถ echo "$var" และใช้ grep/awk/sed ได้ ง่ายและชัดเจน และคุณสามารถมีคอลัมน์ได้มากเท่าที่คุณต้องการ
ตัวอย่าง:
$ 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
หากคุณต้องการค้นหาทุกคนในเปรู
$ echo "$var" | grep peru
thomas johnson peru
johnny lipp peru
เฉพาะ grep(sed) ในฟิลด์ที่สาม
$ echo "$var" | sed -n -E '/(.+) (.+) peru/p'
thomas johnson peru
johnny lipp peru
หากคุณต้องการเพียงฟิลด์ x
$ echo "$var" | awk '{print $2}'
hansen
johnson
abu
johnny
ทุกคนในเปรูเรียกว่าโทมัส และแค่คืนนามสกุลของเขา
$ echo "$var" |grep peru|grep thomas|awk '{print $2}'
johnson
ข้อสงสัยใด ๆ ที่คุณนึกถึง... ง่ายมาก
หากต้องการเปลี่ยนรายการ:
$ var=$(echo "$var"|sed "s/thomas/pete/")
หากต้องการลบแถวที่มี "x"
$ var=$(echo "$var"|sed "/thomas/d")
หากต้องการเปลี่ยนฟิลด์อื่นในแถวเดียวกันโดยยึดตามค่าจากรายการอื่น
$ var=$(echo "$var"|sed -E "s/(thomas) (.+) (.+)/\1 test \3/")
$ echo "$var"
kris hansen oslo
thomas test peru
bibi abu johnsonville
johnny lipp peru
แน่นอนว่าการวนซ้ำก็ใช้ได้เช่นกันหากคุณต้องการทำเช่นนั้น
$ for i in "$var"; do echo "$i"; done
kris hansen oslo
thomas jonson peru
bibi abu johnsonville
johnny lipp peru
สิ่งเดียวที่พบได้ในสิ่งนี้คือคุณ ต้อง อ้างอิง var เสมอ (ในตัวอย่าง; ทั้ง var และ i) ไม่เช่นนั้นสิ่งต่าง ๆ จะมีลักษณะเช่นนี้
$ for i in "$var"; do echo $i; done
kris hansen oslo thomas jonson peru bibi abu johnsonville johnny lipp peru
และบางคนจะพูดอย่างไม่ต้องสงสัยว่ามันจะไม่ทำงานถ้าคุณมีช่องว่างในอินพุตของคุณ อย่างไรก็ตามสามารถแก้ไขได้โดยใช้เดลิมิเตอร์อื่นในอินพุตของคุณ เช่น (ใช้อักขระ utf8 ทันทีเพื่อเน้นว่าคุณสามารถเลือกบางสิ่งที่อินพุตของคุณไม่มี มี แต่คุณสามารถเลือกอะไรก็ได้):
$ 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
หากคุณต้องการจัดเก็บบรรทัดใหม่ในอินพุตของคุณ คุณสามารถแปลงบรรทัดใหม่เป็นอย่างอื่นก่อนอินพุตและแปลงกลับอีกครั้งในเอาต์พุต (หรืออย่าใช้ bash...) สนุก!
person
n00p
schedule
25.04.2017