awk: 주어진 문자열에서 char 발생 횟수를 찾을 수 있나요?

awk: 주어진 문자열에서 char 발생 횟수를 찾을 수 있나요?

다음과 같은 결과를 얻을 수 있는 방법이 있습니까?

a c a c a c a a a a a a a a c c c a c 0 0 a c 0 a

max a
2nd max c

답변1

수행 방법은 다음과 같습니다.

echo "a c a c a c a a a a a a a a c c c a c 0 0 a c 0 a"|tr " " "\n"|sort|uniq -c|sort -rn
  1. tr공백을 줄 바꿈으로 변환하는 데 사용합니다 .
  2. sort데이터(이제 일련의 행)를 알파벳순으로 정렬한 다음
  3. uniq각각의 개수를 계산하는 데 사용되며 마지막으로
  4. 다시 사용하여 sort발생 순서를 내림차순으로 변경합니다(대부분의 발생이 먼저 발생).

각 항목이 공백으로 구분되어 있다고 가정합니다(예제에서도 마찬가지입니다).

답변2

노력하다

echo "i u v w a c a c a c a a a a a a a a c c c a c 0 0 a c 0 a"|
  awk 'BEGIN { RS=" " ; } 
       {a[$1]++;} 
       END { 
           PROCINFO["sorted_in"] = "@val_num_desc" ;
           asorti(a,b) ; 
          i = 1 ; 
          for (aa in a ) {
              printf "%d : %s =%d\n",i++,aa,a[aa] ;
              if ( i == 3 ) exit ;} }'

(한 줄도 가능)

어디

  • BEGIN { RS=" " ; }필드 구분 기호 설정
  • PROCINFO["sorted_in"] = "@val_num_desc" ;배열 값으로 정렬

실제 배열 순서를 보려면 정렬하기 전에 for (aa in a ) printf "a[%s]=%d\n",aa,a[aa] ;추가 할 수 있습니다.PROCINFO

답변3

나는 여기서 루비를 얻고 싶습니다:

echo "a c a c a c a a a a a a a a c c c a c 0 0 a c 0 a" |
ruby -e '
  max = STDIN.gets                                # read the line
             .split                               # split on whitespace
             .group_by {|elem| elem}              # create a hash grouping the words
             .to_a                                # convert has to array of [key,value] pairs
             .map {|key, val| [key, val.length]}  # convert to array of [key, count] pairs
             .sort_by {|key, count| count}        # sort numerically
             .reverse                             # in descending order
  puts "max: " + max[0][0]
  puts "2nd max: " + max[1][0]
'

답변4

다음과 같아야 하는 경우 awk( file"문자열" 포함):

awk 'BEGIN{RS=" "} {a[$1]++} END{for(i in a){if(a[i]>m){m=a[i];f=i}else 
  if(a[i]>n){n=a[i];s=i}}print "max:",f,"\n2nd max:",s}' file

  • BEGIN{RS=" "}줄 구분 기호를 awk공백으로 설정합니다.
  • a[$1]++a인덱스 값과 발생 횟수를 값으로 사용하여 배열을 채웁니다.
  • END{...}END 블록은 모든 행이 처리된 후에 실행됩니다.
    • for(i in a)배열을 반복합니다 a.
    • if(a[i]>m)그 값보다 크다면 m..
    • m=a[i];f=i m이 값과 f문자열로 설정하세요. 이렇게 하면 최대값을 찾을 수 있습니다.
    • else if(a[i]>n){...}: 이제 두 번째 최대값에 대해 동일한 작업을 다시 수행하고 이를 변수에 저장합니다 s.
  • print ...마지막으로 원하는 형식으로 출력을 인쇄합니다.

산출:

max: a
2nd max: c

관련 정보