awk打印行,其中列1匹配,列3是最高值

时间:2015-08-12 09:52:37

标签: awk uniq

我希望打印第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

2 个答案:

答案 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]\+ *//'