특정 문자열을 지정하지 않고 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
사용처 :csvsql
csvkit
파일이 공백으로 구분된 경우:
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는 이를 쉽게 수행할 수 있는 구문을 제공합니다.