在Bash脚本中添加和排序值
我一直在努力解决这个问题,但我尝试过的东西都不管用。我有一个表,其中(来自.txt文件),我需要按照表中特定原始数据的数字顺序进行排序 我拥有的数据如下所示:在Bash脚本中添加和排序值,bash,sorting,Bash,Sorting,我一直在努力解决这个问题,但我尝试过的东西都不管用。我有一个表,其中(来自.txt文件),我需要按照表中特定原始数据的数字顺序进行排序 我拥有的数据如下所示: Name Team Age David a 20 James b 25 Anthony c 22 Carter b 21 Jessica a 24 基本上,我需要订购(从最小到最大)某个团队的年龄,例如a。因此,预期输出为: a 20 a 24 使用SQL
Name Team Age
David a 20
James b 25
Anthony c 22
Carter b 21
Jessica a 24
基本上,我需要订购(从最小到最大)某个团队的年龄,例如a。因此,预期输出为:
a 20
a 24
使用SQL以及SUM和GROUP BY函数可以非常轻松地处理此问题:
SELECT team, SUM(age) FROM table1 GROUP BY team;
+------+----------+
| team | SUM(age) |
+------+----------+
| a | 44 |
| b | 46 |
| c | 22 |
+------+----------+
显然,单靠Bash并不是完成这项工作的最佳工具 如果您像我一样喜欢Bash代码,那么您可能仍然对仅使用Bash的解决方案感兴趣(好吧,几乎是这样,让我们不要重新发明
sort
ing):
#/bin/bash
firstline=true
declare-一个sumPerTeam#declare关联数组
#收集关联数组中每个团队的总和:
当阅读团队年龄时
做
[“$firstline”=true]&&{firstline=;continue;}跳过标题
sumPerTeam[${team}]=$(“${sumPerTeam[${team}]}”+年龄))
完成
关联数组不是Bash最具可读性的功能。没有单独管道和子shell进行排序的
awk
解决方案可能是:
awk '$2 == "a" {arr[$3]} END {for (i in arr) print "a", i}' file
您只需将age
存储为数组中的索引,然后在末尾输出索引,这样无需单独的过程即可提供固有的排序,例如
示例使用/输出
$ awk '$2 == "a" {arr[$3]} END {for (i in arr) print "a", i}' file
a 20
a 24
调用外部排序
,可以减少键入的字符数,但随后会增加管道的额外开销以及排序
所需的子shell,例如
awk '$2 == "a" {print $2, $3}' file | sort
(相同的输出)如果我想对结果数据进行反向排序,我应该能够在sort命令中添加-r,对吗?因为那一点不重要work@AndreaCRD它可以与GNU排序一起使用,但是如果对您不起作用,您可以尝试单独指定
-r
。@oguzismail我尝试添加-r,但它不能颠倒您使用的排序顺序?sort--version
的输出是什么?@oguzismail我使用的是您发布的版本,只是添加了-r标志。输出是:2.3-Apple(99)这如何回答OP(即“在Bash脚本中”)?您提出的第一个解决方案仅适用于GNU awk,其他awk在迭代之前不会对数组索引进行排序。通过调用sort而不使用键定义,您要求输入按字母顺序排序的列表,即a 10
将出现在a 2
之前。
$ awk '$2 == "a" {arr[$3]} END {for (i in arr) print "a", i}' file
a 20
a 24
awk '$2 == "a" {print $2, $3}' file | sort