파일의 모든 문자열 발생 횟수를 계산하고 각 문자열의 평균값을 구하는 방법

파일의 모든 문자열 발생 횟수를 계산하고 각 문자열의 평균값을 구하는 방법

특정 문자열을 지정하지 않고 grep을 사용하여 반복되는 각 문자열의 수를 인쇄하기 위해 cut 명령의 출력을 사용하여 발생 횟수를 계산하려고 합니다. 그런 다음 numaverage를 사용하여 평균을 구하고 싶지만 먼저 숫자를 제거하지 않고 이 작업을 수행하는 방법을 잘 모르겠습니다.
먼저 cut -d " " -f 1 $file 다음 명령을 사용하여 파일의 왼쪽 부분만 볼 수 있도록 절반으로 줄였습니다.

NEUTRON   20.900103
PION-      0.215176
PION-     22.716532
NEUTRON    8.043279
PION+      1.374297
PION-      0.313350
PION+      0.167848

그때까지는 그냥

NEUTRON  
PION-     
PION-     
NEUTRON    
PION+      
PION-      
PION+      

이런 방식으로 cut, grep, numaverage를 함께 수행하려면 어떻게 해야 합니까(예: cat, uniq, wc와 같은 다른 명령이 도움이 될 수 있음)? 이전 출력:

Name          count     Average
KAON-            1      5.489958
NEUTRON          2      14.471691
PHOTON          10      0.652727
PION-            5      5.145192
PION+            7      2.691639
PROTON           1      1.160216

답변1

사용처 :csvsqlcsvkit

파일이 공백으로 구분된 경우:

csvsql -d' ' -S -H --query 'select a as Name, count(*) as count, avg(b) as Average from file group by a' file \
    | csvformat -D' '

또는 파일이 탭으로 구분된 경우:

csvsql -t -S -H --query 'select a as Name, count(*) as count, avg(b) as Average from file group by a' file \
    | csvformat -T

산출:

Name    count   Average
NEUTRON 2   14.471691
PION+   2   0.7710725
PION-   3   7.74835266667

다음 명령을 사용하여 설치해야 할 수도 있습니다 pip.

pip install csvkit

답변2

노력하다 awk:

awk '
    BEGIN{FS=OFS="\t"} # if your file is space-delimited, leave this out
    {c[$1]++;v[$1]+=$2}
    END{
        print "Name","count","Average"
        for(f in c){print f,c[f],v[f]/c[f]}
    }
' file

답변3

두 가지 답변(SQL, AWK) 모두 표준 언어이고 관용적인 방식으로 알고리즘을 구현하기 때문에 마음에 듭니다. 하지만 Q가 특정 솔루션을 고집하는 것 같기 때문에 Q를 더 반대할 예정이었습니다.

그러나 이것이 바로 fgdark의 문제입니다. 유틸리티에 너무 많이 의존하고 관련된 알고리즘을 이해하지 못합니다.

이 매너에서 cut, grep, numaverage를 어떻게 함께 결합합니까(cat, uniq, wc와 같은 다른 명령이 도움이 될 수 있음)?

임시 파일로 시작하여 배관 솔루션을 "쉽게" 찾을 수 있으며 체인이 작동할 때 함께 배관할 수 있습니다. 결과는 만족스럽지 않을 것입니다. 첫째, 평균이 없습니다. 성능도요.

여기에는 SQL 또는 AWK와 같은 "실제" 프로그래밍 언어가 필요합니다. 아니면 펄이나 파이썬, C. 또는 bash - 하지만 bash는 스크립팅 언어로 사용됨연관 배열그리고산술 연산자, "그냥" bash를 쉘로 사용하는 대신.

평균은 필요하지 않습니다()기능SQL 솔루션과 마찬가지로 읽은 데이터를 배열로 계산, 추가, 나누기만 하면 됩니다.

따라서 더 많은 데이터 보고를 수행하려면 다음을 선택해야 합니다.언어. SQL은 조금 특별합니다. 데이터에 강점이 있습니다.채광. 언급된 다른 것(awk, perl, python, C, 심지어 bash)은 모두 데이터와 관련하여 강력합니다.처리(변수/배열/구조 조작). 그러나 상당한 중복이 있습니다.


저는 몇 년 동안 SQL을 사용해 왔습니다. 쿼리와 호출을 저장하는 방법은 다음과 같습니다.

SQL='select a as Name, count(*) as Count, avg(b) as Average' 
SQL+=' from file'
SQL+=' group by a'

csvsql -tSH --query $SQL file | csvformat -T

이것은 비판이 아니라 구조적 쿼리 언어가 어떻게 -구조화된. 이것은 group by집계 함수 sum 이 있는 count절에 대한 교과서 데모 입니다 avg.

+=Bash는 이를 쉽게 수행할 수 있는 구문을 제공합니다.

관련 정보