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","
- 使用逗号作为输入字段分隔符
FNR>=2
- 跳过文件的第一行
printf "%s %10.3f\n"
%s
- 使用格式打印字段 2 ;使用格式打印平均值%10.3f
(宽度为 10 w/ 小数点左侧最多 6 位数字加上小数点加上小数点右侧 3 位数字);在末尾添加换行符 ( \n
)
以上生成:
id1 5.000
id2 15.047
id2 5.349
id4 17.824
OP 增加了一个新要求……按计算的平均值对输出进行排序,但是,有一些潜在问题需要 OP 进一步输入:
- 一个用户 ID 可以在数据文件中多次出现吗?
- 如果一个用户 ID 可以多次出现,那么我们是否需要为每个唯一的用户 ID 生成单行输出,还是为每次出现的用户 ID 生成单独的行?
- 数据是升序还是降序排序?
现在我要假设:
- 一个用户 ID 可能在源数据中出现多次(例如,
id2
在我的示例数据集中 - 上面)。
- 我们不会为给定的用户 ID 组合多行(即,每行将独立存在)。
- 我们将按升序和降序显示排序。
虽然可以在内部进行排序,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
Wheresort -nk2
说使用数字排序按列 #2n
排序。
降序排序:
$ 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
Wheresort -rnk2
说使用n
umeric 排序按列 #2 排序,但要颠倒r
顺序