假设我得到了这个日志文件:
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
任何重复的行都应首先删除。然后交换列。然后根据第一列值(501、500等)对行进行分组,并根据这些值的计数对这些组进行排序。最后,按降序对此类组的第二列值进行排序。
这是我走了多远:
$ 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句