bash - 创建列表列表

时间:2017-05-10 17:00:44

标签: arrays bash syntax append

问题

创建一个数组数组,其中每一行都是我的数据集iris-shuffled.txt中的一行,结构如下:

7.2,3.0,5.8,1.6,Iris-virginica
6.3,2.9,5.6,1.8,Iris-virginica
4.8,3.0,1.4,0.1,Iris-setosa
6.8,3.0,5.5,2.1,Iris-virginica
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.7,1.5,0.2,Iris-setosa
5.1,3.3,1.7,0.5,Iris-setosa
7.3,2.9,6.3,1.8,Iris-virginica
6.7,3.1,5.6,2.4,Iris-virginica
5.8,4.0,1.2,0.2,Iris-setosa

我希望将以下伪代码转换为bash(以了解如何通过bash变得更好),这是我的希望:

 file = data/iris-shuffled.txt
 line_count = NumberOfLines(line);
 container_of_rows = emptyArray();
 for row in file:
     column_container=emptyArray();
    for col in file:
          column_container+=col
    container_of_rows+=column_container

我的最佳解决方案

这不适用于存储第二个数组

脚本

#!/bin/bash

# Grab the data
file=data/iris-shuffled.txt

# Count the lines
num_lines=$(cat data/iris-shuffled.txt | wc -l)
echo $num_lines

# Store lines into an array                
lines=($(cat data/iris-shuffled.txt))
echo ${lines[0]} #row1
echo ${lines[1]} #row2

mega_list=()
for line in "${lines[@]}"
do

        IFS="," read -ra A_ROW <<< "$line"
        echo ${A_ROW[@]}
        list=()
        for i in "${A_ROW[@]}"
        do
                echo $i."~"
               list+=($i)
        done
        mega_list+=(${list}) #not appending right
done

输出:

Iris-setosa.~
5.4 3.7 1.5 0.2 Iris-setosa
5.4.~
3.7.~
1.5.~
0.2.~
Iris-setosa.~
5.1 3.3 1.7 0.5 Iris-setosa
5.1.~
3.3.~
1.7.~
0.5.~
Iris-setosa.~
7.3 2.9 6.3 1.8 Iris-virginica
7.3.~
2.9.~
6.3.~
1.8.~
Iris-virginica.~
6.7 3.1 5.6 2.4 Iris-virginica
6.7.~
3.1.~
5.6.~
2.4.~
Iris-virginica.~
5.8 4.0 1.2 0.2 Iris-setosa
5.8.~
4.0.~
1.2.~
0.2.~
Iris-setosa.~

目标

当我运行echo ${mega_list[0]}时,我的输出只是7.2(row1 col1),但我希望将整行作为单独的数组成员[0]7.2 [1]3.0 [2]5.8 [3]1.6 [4]Iris-virginica

1 个答案:

答案 0 :(得分:0)

如果您使用适当的工具完成任务,这不是一个难题。例如,

awk -F, '{for(i=1;i<=NF;i++) a[NR,i]=$i} END{print a[4,5]}' file

Iris-virginica

取决于您想要对数据执行的操作,您甚至可能不需要将其存储在数组中。

其他示例,稍作修改即可为每个唯一键创建字段总和

$ awk -F, '{for(i=1;i<NF;i++) a[$NF,i]+=$i; 
            u[$NF]} 
       END {for(k in u) 
              {for(i=1;i<NF;i++) printf "%2.1f,", a[k,i]; 
               printf "%s\n", k}}' file

26.1,17.6,7.2,1.2,Iris-setosa
34.3,14.9,28.8,9.7,Iris-virginica