计算每个数字出现的次数

计算每个数字出现的次数

一个文件包含 5 列数字

例子:

12 34 67 88 10
 4 90 12 10 7
33 12 5  76 34

我想打印相同的数字,看看它打印了多少次。例子:

3 : 12
2 : 34

答案1

awk脚本打印输出,如您的示例所示:

awk '{ 
         for ( i=1; i<=NF; i++ ) # loop over all fields/columns
            dict[$i]++;      # count occurrence in an array using the field value as index/key
     }
 END {                           # after processing all data
         for (key in dict)       # iterate over all array keys
             if(dict[key]>1)     # if the key occurred more than once
                 print dict[key] " : " key    # print counter and key
     }' inputfile

对于示例输入,输出为

2 : 10
3 : 12
2 : 34

如果删除条件,if(a[i]>1)它还会列出仅出现过一次的数字。

如果要按出现次数降序对结果进行排序,请追加

| sort -nr

这意味着按相反的数字顺序排序。

所以awk上面显示的命令与排序结合起来

awk '...' inputfile | sort -nr

产生

3 : 12
2 : 34
2 : 10

for正如 Glenn jackman 的评论中提到的,您可以通过PROCINFO["sorted_in"] = "@val_num_desc"在块顶部添加来指示 GNU AWK 在处理时对数组值进行排序END

 END {                           # after processing all data
         # In GNU AWK only you can use the next line to sort the array for processing
         PROCINFO["sorted_in"] = "@val_num_desc" # sort descending by numeric value
         for (key in dict)       # iterate over all array keys
             if(dict[key]>1)     # if the key occurred more than once
                 print dict[key] " : " key    # print counter and key
     }

通过这个 GNU 特定扩展,您无需通过管道传输到sort.

答案2

你可以使用管道

tr -s ' ' '\n' < datafile | sort | uniq -c -d

根据您希望答案的精确程度,您可以过滤数值。删除-d即可查看所有值,而不仅仅是计数大于 1 的值。

答案3

这非常类似于@roaima 的回答,但是sed可以让我们在计数时避免输出中出现多个空格:

$ sed -E 's/ +/\n/g' file | sort | uniq -c -d
      2 10
      3 12
      2 34

并且,要按数字排序并添加:,您可以执行以下操作:

$ sed -E 's/ +/\n/g' file | sort | uniq -c -d | 
    sort -rn | sed -E 's/([0-9]) /\1 : /'
      3 : 12
      2 : 34
      2 : 10

或者:

$ grep -oP '\d+' file | sort | uniq -c -d | 
    sort -rn | sed -E 's/([0-9]) /\1 : /'
      3 : 12
      2 : 34
      2 : 10

或者,与perl

$ perl -lae '$k{$_}++ for @F; 
              END{ 
                @keys = grep { $k{$_} > 1 } keys(%k);  
                @keys = sort { $k{$b} <=> $k{$a} } @keys;

                print "$k{$_} : $_" for @keys
              }' file
3 : 12
2 : 10
2 : 34

或者,如果您喜欢整个简洁性:

$ perl -lae '$k{$_}++for@F}{print"$k{$_} : $_"for sort{$k{$b}<=>$k{$a}}grep{$k{$_}>1}keys(%k)' file 
3 : 12
2 : 10
2 : 34

答案4

命令:

sed "N;s/\n/ /g" filename | sed "N;s/\n/ /g"| perl -pne "s/ /\n/g"| sed '/^$/d'| awk '{a[$1]++}END{for(x in a){print x,a[x]}}'|awk '$2 >1 {print $0}'

输出

sed "N;s/\n/ /g" i.txt | sed "N;s/\n/ /g"| perl -pne "s/ /\n/g"| sed '/^$/d'| awk '{a[$1]++}END{for(x in a){print x,a[x]}}'|awk '$2 >1 {print $0}'

10 2
12 3
34 2

相关内容