Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Bash脚本中添加和排序值_Bash_Sorting - Fatal编程技术网

在Bash脚本中添加和排序值

在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

我一直在努力解决这个问题,但我尝试过的东西都不管用。我有一个表,其中(来自.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以及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