각 숫자의 발생 횟수를 계산합니다.

각 숫자의 발생 횟수를 계산합니다.

파일에는 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

forGlenn 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

관련 정보