Sorting 基于列的相同值的计数进行分组和排序,并对这些组中的另一列进行排序
假设我得到了这个日志文件:Sorting 基于列的相同值的计数进行分组和排序,并对这些组中的另一列进行排序,sorting,awk,Sorting,Awk,假设我得到了这个日志文件: 100.1 500 100.2 501 100.2 501 100.2 501 100.1 501 666.2 501 300.1 555 300.1 501 100.1 300 100.1 300 100.1 300 102.3 500 202.1 500 301.2 300 应首先删除任何重复的行。然后交换列。然后根据第一列值(501500等)对行进行分组,并根据这些值的计数对这些组进行排序。最后,按降序对这些组的第二列值进行排序 这就是我取得的成绩: $ aw
100.1 500
100.2 501
100.2 501
100.2 501
100.1 501
666.2 501
300.1 555
300.1 501
100.1 300
100.1 300
100.1 300
102.3 500
202.1 500
301.2 300
应首先删除任何重复的行。然后交换列。然后根据第一列值(501500等)对行进行分组,并根据这些值的计数对这些组进行排序。最后,按降序对这些组的第二列值进行排序
这就是我取得的成绩:
$ awk '{!seen[$2, $1]++}; END {for (i in seen) print i}' $filename |
sort -k2 -n -r
555?300.1
501?666.2
501?300.1
501?100.2
501?100.1
500?202.1
500?102.3
500?100.1
300?301.2
300?100.1
这是预期输出:
501 666.2
501 300.1
501 100.2
501 100.1
500 202.1
500 102.3
500 100.1
300 301.2
300 100.1
555 300.1
有了GNU
awk
你可以试试下面的内容吗,尽管我仍然不确定OP是否需要它。因为OP在评论中确认了这一点,所以添加了这个答案,并要求OP相应地更改问题
awk '
!c[$1,$2]++{
a[$2]++
b[$2]=(b[$2]?b[$2] ORS:"")$2 OFS $1
}
END{
PROCINFO["sorted_in"] = "@val_num_desc"
for(i in a){ print b[i] }
}
' Input_file
(Sundeep编辑)我自己并不完全理解这一点,但这似乎适用于
GNU awk
$ awk 'BEGIN{PROCINFO["sorted_in"] = "@val_num_desc"};
!seen[$0]++{a[$2]++; b[$2][$1]}
END{for(i in a) for(j in b[i]) print i, j}' ip.txt
501 666.2
501 300.1
501 100.2
501 100.1
500 202.1
500 102.3
500 100.1
300 301.2
300 100.1
555 300.1
有了GNU
awk
你可以试试下面的内容吗,尽管我仍然不确定OP是否需要它。因为OP在评论中确认了这一点,所以添加了这个答案,并要求OP相应地更改问题
awk '
!c[$1,$2]++{
a[$2]++
b[$2]=(b[$2]?b[$2] ORS:"")$2 OFS $1
}
END{
PROCINFO["sorted_in"] = "@val_num_desc"
for(i in a){ print b[i] }
}
' Input_file
(Sundeep编辑)我自己并不完全理解这一点,但这似乎适用于
GNU awk
$ awk 'BEGIN{PROCINFO["sorted_in"] = "@val_num_desc"};
!seen[$0]++{a[$2]++; b[$2][$1]}
END{for(i in a) for(j in b[i]) print i, j}' ip.txt
501 666.2
501 300.1
501 100.2
501 100.1
500 202.1
500 102.3
500 100.1
300 301.2
300 100.1
555 300.1
另一种方法:这是施瓦茨变换
sort-u文件\
|awk'
{count[$2]+;a[NR]=$1;b[NR]=$2}
END{for(i=1;i另一种方法:这是一种Schwartzian变换
sort-u文件\
|awk'
{count[$2]+;a[NR]=$1;b[NR]=$2}
结束{for(i=1;然后更新您的问题以反映您在最后一条评论中所说的内容。奇怪的字符是因为您正在使用$2,$1
构成键,您可以使用$2 FS$1
instead@klabbaparn,这是不是awk'!c[$1,$2]+{a[$2]+;b[$2]=(b[$2]?b[$2]or:“)$2 of s$1}结束{PROCINFO[“sorted_in”]=“@val_num_desc”(我在一个{print b[i]}'输入_文件中
就在你想要的附近吗?请检查一下。@RavinderSingh13是的,它工作得很好。哇..现在我不得不消化一下。比预期的难多了,@Klabbarn,老实说,你的问题不清楚。这是一个猜测(基于评论,我仍然不能完全确定这是否对你有效:),请使用正确的详细信息编辑您的问题,谢谢。然后更新您的问题以反映您在最后一条评论中所说的内容。奇怪的字符是因为您使用$2,$1
来构成密钥,您可以使用$2 FS$1
instead@klabbaparn,这是不是awk'!c[$1,$2]+{a[$2]+;b[$2]=(b[$2]?b[$2]or:“)$2 OFS$1}结束{PROCINFO[“sorted_in”]=“val_num_desc”;for(i in a){print b[i]}'的输入_文件
就在你想要的附近?请检查一下。@RavinderSingh13是的,它工作得很好。哇..现在我不得不消化这个。比预期的难多,@klabaparn,老实说,你的问题不清楚。这是个猜测(根据评论,我仍然不能完全确定这是否适用于您:)),请用正确的详细信息编辑您的问题,谢谢。此操作已结束,需要按降序对第二列进行排序order@Sundeep,:)哦,但是OP证实它是有效的:)您建议的任何编辑都不仅仅是欢迎喝彩:)我也会和OP核对一下。@klabbaparn,当然,请您更新您的问题,这样就不会有人感到困惑:)此解决方案不会按第二列排序,但会处理您提到的其他内容。@Sundeep,您好,先生,看起来OP不想按第二列c排序Column(但希望具有解决方案的其余条件)。如果您有任何建议,请务必让我知道,或者您完全有权编辑此建议,干杯并保持安全。此操作已完成,需要按降序对第二列进行排序order@Sundeep,:)哦,但是OP确认它是有效的:)你建议的任何编辑都不仅仅是欢迎的欢呼:)我也会和OP检查一下同样的内容。@Klabparn,当然,Requeue请您更新您的问题,这样就不会有人感到困惑:)此解决方案不会按第2列排序,但会处理您提到的其余内容。@Sundeep,您好,先生,看起来OP不想按第2列排序(但希望解决方案中包含其余条件)。如果您有任何建议,请告诉我,或者您完全有权编辑此项,干杯并保持安全。我使用此解决方案,因为它更容易理解。但是,我不太理解此部分“-k 1,1-k 3,3”,我知道它与按键排序有关(?)阅读排序手册页了解所有详细信息。这意味着:使用第一列(出现次数)作为主排序键,然后使用第三列作为第二排序键。我使用这个解决方案,因为它更容易理解。但是,我不太理解这部分“-k 1,1-k 3,3”,我知道它与按键排序有关(?)阅读排序手册页了解所有详细信息。即:使用第一列(出现次数)作为主要排序键,然后使用第三列作为第二个排序键。