我一直试图用两种方法遍历具有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,因为该表被提及。
答案 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
结尾。