假设我在Bash(4.3)中有以下(换行符分隔)数组:
abc def ghi jkl # ${myArray[0]}
abc def ghi jkl mno # ${myArray[1]}
abc def ghi # ${myArray[2]}
...
我想将此列向下拆分为以下数组变量:
# First column
abc # ${myArray_col1[0]}
abc # ${myArray_col1[1]}
abc # ${myArray_col1[2]}
...
# Second column
def # ${myArray_col2[0]}
def # ${myArray_col2[1]}
def # ${myArray_col2[2]}
...
# Third column, and all following
ghi jkl # ${myArray_col3_and_onward[0]}
ghi jkl mno # ${myArray_col3_and_onward[1]}
ghi # ${myArray_col3_and_onward[2]}
...
我知道可以通过多种方式完成此任务(awk
,read -a
等),而且大多数都涉及某种循环。
然而,我能够提出的最简单,最简短,最快捷的方法是:
myArray_col1=($(echo ${myArray[*]} | cut -f 1 -d ' '))
myArray_col2=($(echo ${myArray[*]} | cut -f 2 -d ' '))
myArray_col3_and_onward=($(echo ${myArray[*]} | cut -f 4- -d ' '))
(当然$IFS
设置为换行符。)
虽然这非常适合我的需要,但是对于echo
和cut
看似不必要的三重调用,我有一部分感到非常恼火:)
有什么办法可以避免这种情况吗?我正在寻找类似的东西:
(MAGIC SYNTAX HERE)=($(echo ${myArray[*]} | cut -f 1,2,4- -d ' '))
注意:我获得原始数组的方式在许多方面已经是最方便/最快的(而且,它不受我的直接控制:)),所以我宁愿不接触它。 / p>
答案 0 :(得分:2)
bash
并没有内置这种类型的换位,但是以下循环应该足够了(不需要外部过程)。
for row in "${myArray[@]}"; do
read col1 col2 col3plus <<< "$row"
myArray_col1+=( "$col1" )
myArray_col2+=( "$col2" )
myArray_col3_and_onward+=( "$col3plus" )
done