在给定的数据中,是否可以对每个区域进行 uniq 排序并仅打印最热门的命中?
给定数据
aza1 18
bcn1 16
sat2 12
lcy2 12
fra1 12
aza1 12
bcn1 10
sat2 8
lcy2 9
fra1 13
aza1 21
bcn1 2
sat2 10
lcy2 0
fra1 1
所需输出
aza1 21
bcn1 16
sat2 12
lcy2 12
fra1 13
答案1
如果顺序很重要,则解决方案仅使用种类和独特的
<INPUT_FILE sort -k 1,1 -k 2nr,2 | uniq -w4
输出:
aza1 21
bcn1 16
fra1 13
lcy2 12
sat2 12
排序参数:
-k:按键排序(在本例中为列,与 -t 配对)
-n:按数字排序
-r:相反的顺序
(可选)-t:如果您想更改键分隔符(默认值:空格)
唯一参数:
-w:选择前N个字符
解释:
在您的问题中,我们需要首先对第一列进行排序,然后对第二列进行排序。所以有一个-k 1,1其次是-k 2,2。但是,第二把钥匙(仅有的)必须按数字按相反顺序排序。因此,应该是-k 2nr,2。
请注意,如果 -n 或 -r 排序参数位于 -k 参数之外,则它们将应用于整个输入而不是特定键。
最后,我必须找到唯一的行,但仅匹配前 4 个字符。因此,优衣库-w 4
答案2
如果顺序无关紧要:
<infile sort -rnk2,2 |sort -uk1,1
-r
在第 ey 列编号( )上-n
使用数字,然后在第一个ey 列 ( )上保留并标记行;sort
-k
2
sort -rnk2,2
-u
-k
sort -uk1,1
或与以下相同awk
:
<infile awk '
{ arr[$1]= (arr[$1]<$2)? $2 : arr[$1] }
END{ for (x in arr) print x, arr[x] }'