подсчитать, сколько раз встречается каждое число

Я не эксперт, но я заметил, что, если вы не отключите функцию быстрой загрузки Windows 10 перед установкой Linux, возникнут сложности такого типа.

2
24.02.2019, 17:06
6 ответов

Этот 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

Как упоминалось в комментарии glenn jackman, вы можете указать GNU AWK сортировать значения массива при обработке с помощью for, добавив PROCINFO["sorted_in"] = "@val_num_desc"поверх блока 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.

10
27.01.2020, 21:49

Можно использовать конвейер

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

В зависимости от того, насколько точным вы хотите получить ответ, вы можете отфильтровать числовые значения. Удалите -d, чтобы увидеть все значения, а не только те, где количество больше единицы.

9
27.01.2020, 21:49

хорошо я решил:

awk '($1 > 1) && ($2 > 0) { print $1 " : " $2 }' xxx.txt | sort | uniq -c | sort -nr

Всем спасибо

-3
27.01.2020, 21:49

Предполагая, что ваш входной файл называется barи структурирован так же хорошо, как вы иллюстрируете (пробелы и/или новые строки между числами ), одним из решений может быть:

for n in $(cat bar); do echo "$n"; done | sort | uniq -c | sort -nr
1
27.01.2020, 21:49

Это очень похоже на ответ @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
2
27.01.2020, 21:49

команда:

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
0
27.01.2020, 21:49

Теги

Похожие вопросы