所以我有一个.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位进行排序。
答案 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