【问题标题】:awk print row where column 1 matches and column three is highest valueawk 打印第 1 列匹配且第 3 列最高值的行
【发布时间】:2015-11-04 20:37:20
【问题描述】:

我希望打印第 1 列和第 2 列,其中第 1 列匹配,第 3 列是最高值。我目前正在使用 awk 和 sort 来获得这种类型的输出:

    EXCEPTION 91 3
    EXCEPTION 15 5
    TEST 5 1
    TEST 1 8

我正在寻找的最终期望输出:

EXCEPTION 15
TEST 1

这是一个文件示例和我正在运行的命令来获取 uniq 计数。我真正想要的是 sort 打印 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

【问题讨论】:

    标签: awk uniq


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      你说你不想要糟糕的uniq 逻辑......但如果你改变主意,这个任务确实非常适合 sort/uniq/cut 的权限(尽管它不如 awk 高效解决方案)。

      从您的测试文件中,您可以获得所需的输出

      sort -k1,2n < testing | 
          uniq -c |
          sort -k2,2 -k1rn,1 |
          cut -c8- |
          sort -u -k1,1
      

      按顺序:按字母顺序(默认)按第一列排序,然后按数字按第二列排序 - 这会将相同的行按顺序排列。

      然后计算每一行的出现次数,在每行前面加上 8 个字符,包含计数和空格。

      按现在是第二个字段的字符串 (EXCEPTION, TEST) 排序后按计数降序排序。

      删除每行的前 8 个字符(计数)。

      最后按字符串“排序”并且只输出唯一值。由于您感兴趣的记录已排序到顶部,因此这是它输出的记录。这可以被认为是“uniq by field”。

      (如果要从输入中删除尾随空格,可以将cut 命令替换为sed 's/^ *[0-9]\+ *//'

      【讨论】:

        猜你喜欢
        • 2018-05-10
        • 1970-01-01
        • 2021-11-25
        • 2014-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多