다음과 같은 결과를 얻을 수 있는 방법이 있습니까?
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
tr
공백을 줄 바꿈으로 변환하는 데 사용합니다 .sort
데이터(이제 일련의 행)를 알파벳순으로 정렬한 다음uniq
각각의 개수를 계산하는 데 사용되며 마지막으로- 다시 사용하여
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