如何将列(和列范围)分配给单独的数组变量?

时间:2014-05-27 14:03:33

标签: arrays bash shell micro-optimization

假设我在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]}
...

我知道可以通过多种方式完成此任务(awkread -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设置为换行符。)

虽然这非常适合我的需要,但是对于echocut看似不必要的三重调用,我有一部分感到非常恼火:)

有什么办法可以避免这种情况吗?我正在寻找类似的东西:

(MAGIC SYNTAX HERE)=($(echo ${myArray[*]} | cut -f 1,2,4- -d ' '))

注意:我获得原始数组的方式在许多方面已经是最方便/最快的(而且,它不受我的直接控制:)),所以我宁愿不接触它。 / p>

1 个答案:

答案 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