代码之家  ›  专栏  ›  技术社区  ›  letronje

使用命令行工具计算排序序列中的重复项

  •  97
  • letronje  · 技术社区  · 17 年前

    例如,如果cmd1的输出为:

    100 
    100 
    100 
    99 
    99 
    26 
    25 
    24 
    24
    

    我需要另一个命令,我可以通过管道将上述输出传输到该命令,这样,我得到:

    100     3
    99      2
    26      1
    25      1
    24      2
    
    7 回复  |  直到 10 年前
        1
  •  101
  •   diguage Stephen Paul Lesniewski    7 年前

    怎么样;

    $ echo "100 100 100 99 99 26 25 24 24" \
        | tr " " "\n" \
        | sort \
        | uniq -c \
        | sort -k2nr \
        | awk '{printf("%s\t%s\n",$2,$1)}END{print}'
    

    结果是:

    100 3
    99  2
    26  1
    25  1
    24  2
    
        2
  •  57
  •   Ibrahim    10 年前

    uniq -c 至少适用于GNU uniq 8.23,并且完全按照您的意愿运行(假设输入是排序的)。

        3
  •  10
  •   ghostdog74    17 年前

    如果顺序不重要

    # echo "100 100 100 99 99 26 25 24 24" | awk '{for(i=1;i<=NF;i++)a[$i]++}END{for(o in a) printf "%s %s ",o,a[o]}'
    26 1 100 3 99 2 24 2 25 1
    
        4
  •  9
  •   ericcurtin    6 年前

    对数字进行反向数字排序,然后计算重复项,然后交换左右单词。对齐成列。

    printf '%d\n' 100 99 26 25 100 24 100 24 99 \
       | sort -nr | uniq -c | awk '{printf "%-8s%s\n", $2, $1}'
    
    100     3
    99      2
    26      1
    25      1
    24      2
    
        5
  •  2
  •   Toby Speight    8 年前

    在Bash中,我们可以使用 联合数组 对每个输入值的实例进行计数。假设我们有命令 $cmd1

    #!/bin/bash
    
    cmd1='printf %d\n 100 99 26 25 100 24 100 24 99'
    

    然后我们可以计算数组变量中的值 a ++ 相关数组条目的数学运算符:

    while read i
    do
        ((++a["$i"]))
    done < <($cmd1)
    

    for i in "${!a[@]}"
    do
        echo "$i ${a[$i]}"
    done
    

    sort 钥匙:

    for i in $(printf '%s\n' "${!a[@]}" | sort -nr)
    do
        echo "$i ${a[$i]}"
    done