循环遍历文件的每一行并求和字段

时间:2019-01-26 23:38:29

标签: bash

所以我有一个.csv文件,其中包含以下格式的数据:

ID, text, value_1, value_2, value 3
1, abc, 10, 20, 30
2, def, 40, 50, 60
3, ghi, 70, 80, 90

我正在尝试编写一个shell脚本,以便它将每一行并为每个变量value_1,value_2和value_3分配一个值,然后将它们求和成一个总变量。这样做的目的是,让我可以找到文件中前10行的总数最高的行。

例如,第1行的总变量为60。

我已经概述了该问题的伪代码,但是在将每个字段中的值分配给变量时遇到了麻烦。

# !/ bin/bash

# NUM_VALUE_1=0
# NUM_VALUE_2=0
# NUM_VALUE_3=0
# TOTAL=0
# HIGHEST=()

# for line in $(selecting fields 3, 4, 5); do
#    NUM_VALUE_1 = $line(f3)
#    NUM_VALUE_2 = $line(f4)
#    NUM_VALUE_3 = $line(f5)
#
#    TOTAL = NUM_VALUE_1 + NUM_VALUE_2 + NUM_VALUE_3
#
#    Keep line if total is in the top 10 highest values
# done
#
# print the top 10 lines

我正在处理的代码:

NUM_VALUE_1=0
NUM_VALUE_2=0
NUM_VALUE_3=0
TOP_10=()

for line in $(tail -n +2 data.csv | cut -d, -f3,4,5); do 

    NUM_VALUE_1="echo $line | cut -d, -f1"
    NUM_VALUE_2="echo $line | cut -d, -f2"
    NUM_VALUE_3="echo $line | cut -d, -f3"

    $TOTAL=$((NUM_VALUE_1 + NUM_VALUE_2 + NUM_VALUE_3))

    #keep only if its in the highest 10
done

我只是bash的新手,所以尝试了很多变体并且走得还很远。我认为一旦找到如何将字段分配给我最常使用的变量,我就可以对前10位进行排序。

1 个答案:

答案 0 :(得分:0)

为什么不使用更简单的解决方案而不是使用for循环

echo ID, text, value_1, value_2, value_3 > /tmp/mio.csv
echo 1, abc, 10, 20, 30 >> /tmp/mio.csv
echo 2, def, 40, 50, 60 >> /tmp/mio.csv
echo 3, ghi, 70, 80, 90 >> /tmp/mio.csv

tail -n +2 /tmp/mio.csv | awk '{ SUM = $3+$4+$5 } { print SUM , ",",  $0 }' | sort -n -k 1 | tail -n 10

#Eventually you can chain a cut to purge the totalization column