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按第3列和第1列排序_Bash_Sorting_Awk - Fatal编程技术网

Bash按第3列和第1列排序

Bash按第3列和第1列排序,bash,sorting,awk,Bash,Sorting,Awk,接收文件 website1 ip 20 website1 ip 30 website1 ip 10 website2 ip 200 website2 ip 10 website3 ip 150 我需要它排序,以便与相关网站的第三个总和将显示与最高的网站总数第一 网站2有210个网站3有150个网站1有60个 website2 ip 200 website2 ip 10 website3 ip 150 website1 ip 30 website1 ip 20 website1 ip 10

接收文件

website1 ip 20
website1 ip 30
website1 ip 10
website2 ip 200
website2 ip 10 
website3 ip 150
我需要它排序,以便与相关网站的第三个总和将显示与最高的网站总数第一

网站2有210个网站3有150个网站1有60个

website2 ip 200
website2 ip 10
website3 ip 150
website1 ip 30
website1 ip 20
website1 ip 10

我尝试了sort-k3n-k1n,但这不是我要查找的230个website2 ip 200的结果。您可以使用awk对每个网站的第3列(第1列)进行2次传递和求和,并在输出中添加一个新列。然后在输出中使用新列进行排序,最后使用
cut
从输出中删除第一列:

awk 'FNR==NR{sum[$1]+=$3; next} {print sum[$1] "\t" $0}' file file |
sort -k1nr -k4nr |  cut -f2-

website2 ip 200
website2 ip 10
website3 ip 150
website1 ip 30
website1 ip 20
website1 ip 10
awk
命令的输出:

awk 'FNR==NR{sum[$1]+=$3; next} {print sum[$1] "\t" $0}' file file

60  website1 ip 20
60  website1 ip 30
60  website1 ip 10
210 website2 ip 200
210 website2 ip 10
150 website3 ip 150

您可能找不到“纯”
sort
解决方案<代码>排序逐行比较,但您的排序标准取决于分组排序,然后是行。嘿@anubhava谢谢您的帮助,它是按第一列的总和排序的,但它没有按顺序排列第四列。你也可以试试这个命令:
awk'FNR==NR{sum[$1]+=$3;next}{print sum[$1]“\t”$0}file文件| sort-k1nr-k4nr | cut f2-
ahhh我知道问题出在哪里。我的原始文本文件没有我的示例那么完美。IP和计数之间有2个空格,因此无法工作。我只需要把它清理干净,它就行了!事实上,这不是问题所在,为什么它会对网站1、网站2、网站3进行排序,但不会对真实的网站进行排序……如果你能在pastebin.com上提供你的实际数据样本,那么我肯定可以研究一下。