我希望打印第1列和第1列。 2列1匹配,列3是最高值。我目前正在使用awk并排序以获得此类输出:
EXCEPTION 91 3
EXCEPTION 15 5
TEST 5 1
TEST 1 8
我正在寻找的最终所需输出:
EXCEPTION 15
TEST 1
这是一个文件示例以及我运行以获取uniq计数的命令。我真正想要的是排序打印uniq排序中的最后一条记录
例外15
所以我没有所有疯狂的uniq --count逻辑。 IE:我想知道column1是否匹配> = 3次并打印该匹配的最后记录的第二列值。
cat /tmp/testing.txt |grep EXCEPTION
EXCEPTION 15
EXCEPTION 15
EXCEPTION 15
EXCEPTION 91
EXCEPTION 91
EXCEPTION 91
EXCEPTION 91
EXCEPTION 15
EXCEPTION 15
cat /tmp/testing.txt|awk '{print $1 " " $2}'|sed '/^$/d'| awk '$2 >= '1' '|sort |uniq --count|awk '{print $1" "$2" "$3}'|awk '$1 >= '3''|awk '{print $1" "$2" "$3}'|awk '{print $2" "$3" "$1}'
EXCEPTION 15 5
EXCEPTION 91 4
答案 0 :(得分:1)
只需跟踪任何给定第一个字段的最大值并存储其相应的第二个字段:
awk '{if ($3>max[$1])
{max[$1]=$3; val[$1]=$2}
}
END {for (i in val) print i, val[i]}' file
$ awk '{if ($3>max[$1]) {max[$1]=$3; val[$1]=$2}} END {for (i in val) print i, val[i]}' file
EXCEPTION 15
TEST 1
答案 1 :(得分:0)
你说你并不想要可怕的uniq
逻辑...但是如果你改变主意,这个任务确实非常适合排序/ uniq / cut的权限(尽管这个并不像awk解决方案那样高效。)
从测试文件中,您可以使用
获得所需的输出sort -k1,2n < testing |
uniq -c |
sort -k2,2 -k1rn,1 |
cut -c8- |
sort -u -k1,1
按顺序排序:按字母顺序排列第一列(默认),然后按数字排序第二列 - 按顺序排列相同的行。
然后计算每一行的出现次数,在包含计数的每一行前加8个字符和空格。
按字符串(EXCEPTION,TEST)排序后按次数降序排序,该字符串现在是第二个字段。
从每行中删除前8个字符(计数)。
最后&#34;排序&#34;通过字符串,只输出唯一的。由于您感兴趣的记录已经排到最前面,这就是它输出的记录。这可以被视为&#34; uniq
字段。&#34;
(如果要从输入中删除尾随空格,可以将cut
命令替换为sed 's/^ *[0-9]\+ *//'
)