Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何将列(和列范围)分配给单独的数组变量?_Arrays_Bash_Shell_Micro Optimization - Fatal编程技术网

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

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

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