열 부분 집합을 만들고 해당 길이로 나눕니다.

열 부분 집합을 만들고 해당 길이로 나눕니다.

특정 값(예: >= 2)으로 하위 집합을 지정한 다음 열의 초기 숫자의 총 개수로 나누려는 열이 있습니다. 어떻게 해야 하나요?

하위 집합 >= 2의 예:

입력: 이와 같은 열

1  
1    
1  
1  
2  
2  

산출:

2/6=0.33333  

나는 awk를 사용하여 이와 같은 것을 시도했습니다.

awk '($1 > 2) / $1' myfile

그러나 이것은 작동하지 않습니다.

답변1

> 2귀하 의 예에는 값이 없으므로 >= 2.

awk '$1 >= 2 { t++ } END { print t/NR }' myfile

이는 첫 번째 열의 각 값을 반복하고 값이 2보다 크거나 같으면 변수를 증가시킵니다 t. 마지막으로 t전체 레코드 수(행 수)로 나누어 결과가 인쇄됩니다.

문자 그대로 방정식을 인쇄하려면 다음을 수행하십시오.

awk '$1 >= 2 { t ++ } END { print t"/"NR"="t/NR }' myfile

답변2

dc유틸리티를 사용하여 계산을 수행할 수 있습니다.

$ < myfile  tr -s ' ' '\t' | cut -f1 |
 dc -e "
   [lM lN / p q]sq
   [lM 1 + sM]sa
   [? z0=q lN 1 + sN d2!>a c z0=?]s? 
   4k 0sN l?x
 "

결과:

.3333

간략한 설명:

° Register `N` holds line count.
° Register `M` holds num of lines >= 2.
° Register `q` performs the division, printing it, and quitting. Kinda like the `END` clause of `awk`.
° Register `a` increments the current value stored in register `M`.
° Register `? ` reads the next line from stdin, checks whether it is empty. In case it us then it initiates the end procedure by invoking the q register. Otw, increments register N  the one keeping the line count. Then compares the current line is greater than or equal to 2 . Increments reg M if it is. Then calls itself recursively to redo the same set of operations on the next line.
° 4k will set output accuracy to four digits and 0sN shall initialize the line counter, l?x will set the ball rolling recursively. 

관련 정보