我试图解析一个csv文件(其中包含每个用户的用户I和工作时间)。我写了以下脚本:
#save weekly average to a file
while IFS=, read -r col1 col2 col3 col4 col5 col6 col7
do
echo "$col2 ($col3+$col4+$col5+$col6+$col7)/5"
done < user-list.txt我面临以下两个问题:
输入文件中的一些示例数据是:
Computer ID,User ID,M,T,W,T,F
Computer1,User3,5,7,3,5,2任何帮助都将不胜感激。提亚
发布于 2020-11-19 21:21:26
OP尚未(尚未)提供任何示例输入数据或期望的输出,因此假设如下:
。
一些样本数据:
$ cat user-list.txt
a,b,c,d,e,f,g,h
1,id1,3,4,5,6,7
2,id2,13,14.233,15,16,17
3,id2,3.2,4.3,5.9233,6.0,7.32
4,id4,-3.2,4.3,-15.3,96.0,7.32一种awk解决方案:
$ awk -F"," 'FNR>=2 { printf "%s %10.3f\n", $2, ($3+$4+$5+$6+$7)/5.0 }' user-list.txt其中:
-F"," -使用逗号作为输入字段separatorFNR>=2 -跳过fileprintf "%s %10.3f\n"的第一行-使用%s格式打印字段2;使用%10.3f格式打印平均值(小数点左侧为10 w/最大值6位,小数右侧为3位);在末尾附加一行提要(\n)。
以上所述产生:
id1 5.000
id2 15.047
id2 5.349
id4 17.824OP增加了一个新的要求..。然而,根据计算的平均数对输出进行排序,有几个潜在的问题需要OP进一步的投入:
现在我要假设:
id2一样-上面)。H 241f 242虽然排序可以在awk中完成,但我将选择将awk输出输送到sort,因为这需要更少的代码,而且(imo)更容易理解。
提升排序:
$ awk -F"," 'FNR>=2 { printf "%s %10.3f\n", $2, ($3+$4+$5+$6+$7)/5.0 }' user-list.txt | sort -nk2
id1 5.000
id2 5.349
id2 15.047
id4 17.824其中sort -nk2说使用n数字排序按列#2排序。
降序排序:
$ awk -F"," 'FNR>=2 { printf "%s %10.3f\n", $2, ($3+$4+$5+$6+$7)/5.0 }' user-list.txt | sort -rnk2
id4 17.824
id2 15.047
id2 5.349
id1 5.000其中sort -rnk2说使用n数字排序按列#2排序,但r则使用顺序
发布于 2020-11-19 21:05:17
试一试
awk -F, 'NR > 1 { map[$2]=($3+$4+$5+$6+$7)/5 } END { PROCINFO["sorted_in"]="@val_num_asc";for (i in map) { printf "%s %.2f\n",i,map[i] } }' user-list.txt通过-F使用逗号作为字段分隔符,添加第三、第四、第五、第六和第七个字段,然后除以5,将结果放入一个名为map的数组中,由用户索引($2)。忽略NR > 1的标头。最后,将数组的排序设置为值的升序,并通过数组循环,打印索引(用户)和值到小数点2位。
发布于 2020-11-19 21:09:39
对于您的第一个问题,这将解决以下问题:
#save weekly average to a file
while IFS=, read -r col1 col2 col3 col4 col5 col6 col7
do
echo "$col2 ($col3+$col4+$col5+$col6+$col7)/5"
done < <tail -n +2 user-list.txt第二个更复杂一些-- echo命令仅用于显示变量内容或ny类的输出,而不是用于数学表达式。使用下面的expr命令:
myvar=$((1 + 2)); result=$(($myvar / 3)); echo $result像这样的事情,只要稍微适应一下你的问题,就能解决它。
https://stackoverflow.com/questions/64919776
复制相似问题