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
Sorting 基于列的相同值的计数进行分组和排序,并对这些组中的另一列进行排序_Sorting_Awk - Fatal编程技术网

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”,我知道它与按键排序有关(?)阅读排序手册页了解所有详细信息。即:使用第一列(出现次数)作为主要排序键,然后使用第三列作为第二个排序键。