遍历csv文件bash脚本的列

时间:2020-04-10 04:01:19

标签: linux bash

我一直试图用两种方法遍历具有20列的文件,第一种方法是使用列的名称创建一个数组,然后使用for传递它,但是它不起作用。

#!/bin/bash
a="${@}"
columns=('$col2' col3 col4 col5 col6 coll7 col8 col9 col10 col11 col12 col13 col14 col15 col16 
col17 col18 col19 col20)
for elem in ${columns[*]}
do
    while IFS=, read -r col1 col2 col3 col4 col5 col6 coll7 col8 col9 col10 col11 col12;do
        b+=($elem)
    done < $a
    printf '%s\n' "${b[*]}"
done  

另一种方法看起来像是整行,不是这个主意,我想单独整​​列,而不是逐行。但是,此代码没有用,似乎是for编写方式的问题。

#!/bin/bash
a="${@}"
while IFS= read -r line; do
    IFS=, read -ra fields <<<"$line"
    for ((i=${fields[@]} ; i >= 1 ; i-- ))
    do
    printf '%s' "${fields[i]}"
    done
done < $a

我有一张下表,代表每年的销售量。我想每年核对每种产品的信息并进行汇总,以验证总数,因为在某些情况下此总数值不正确。因此,例如在2004年,如果您将每种产品的总和(45.000 + 70.000 + 100.000),则输出不是323.000,因为该表被提及。

enter image description here

https://easyupload.io/3lpz6p

1 个答案:

答案 0 :(得分:1)

虽然Bash可能不是验证每列总数的最有效方法,但有一种方法可以做到,我很高兴找到解决方案。

背景

我找到了一种使用Bash获取一列中的总值的方法。我的想法是使用read命令,并确保仅read用户在变量col_num中指定的列中的值。这是因为read命令逐行通过一个文件。在下面的示例中,我将col_num指定为0,这意味着read命令将逐行通过.csv输入,同时仅抓取第一列。然后,我根据this以Bash方式添加了值。

我相信,只需对我的代码进行少量调整,即可使其在终止之前遍历所有20列。但是由于您只有20列,所以我认为为每一列增加col_num并不会太糟糕。

我的解决方案

#!/bin/bash

{
    # this reads the first row which has the column names so we will not go 
    # through that row in the loop below
    read

    # this is where you specify the column number
    col_num=0

    # var_2 specifies the number of values (length) grabbed per line. we only 
    # want one value from each line so let it be 1
    var2=1

    while IFS=, read -a arr
    do
        final_arr+=`echo "${arr[@]:$col_num:$var2} + "`
        column_total="$(($final_arr 0)) "      
    done
    echo $column_total
} < input.csv

重要说明:该脚本适用于除最后一列之外的所有列,可能是因为该脚本未以comma结尾。