Arrays 如何将列(和列范围)分配给单独的数组变量?
假设我在Bash(4.3)中有以下(换行分隔)数组: 我想按列将其拆分为以下数组变量:Arrays 如何将列(和列范围)分配给单独的数组变量?,arrays,bash,shell,micro-optimization,Arrays,Bash,Shell,Micro Optimization,假设我在Bash(4.3)中有以下(换行分隔)数组: 我想按列将其拆分为以下数组变量: # 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
# 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 ' '))
注意:我获取原始数组的方式在很多方面已经是最方便/最快的(而且,它不在我的直接控制范围之内:),所以我不想碰它。
bash
并没有内置这种类型的转置,但是下面的循环应该足够了(无需外部流程)
对于“${myArray[@]}”中的行
阅读col1 col2 col3plus+1,尽管它不是我所希望的那样优雅……它实际上比大型输入数组重复的cuts
要慢得多;我怀疑这是因为这个循环需要动态调整数组大小,而cut
事先知道输出数组将有多大ode>$IFS
设置为换行符,除非将其设置为空格,否则读取的将无法正确拆分。您可以在IFS=$”中本地重写IFS
。\n“read col1 col2 col3plus One并不总是可以自由选择语言。更重要的是,信不信由你,我不是在处理数据,我在粘合:)
(MAGIC SYNTAX HERE)=($(echo ${myArray[*]} | cut -f 1,2,4- -d ' '))
for row in "${myArray[@]}"; do
read col1 col2 col3plus <<< "$row"
myArray_col1+=( "$col1" )
myArray_col2+=( "$col2" )
myArray_col3_and_onward+=( "$col3plus" )
done