명령줄에서 값 목록을 숫자로 나누는 방법은 무엇입니까?

명령줄에서 값 목록을 숫자로 나누는 방법은 무엇입니까?

Unix 유틸리티를 사용하여 간단한 프로그램을 명령줄로 변환하려고 합니다. 예를 들어, 주파수 목록이 있는 경우(uniq를 통해 파이핑하고 정렬한 후)

5 x
4 y
1 z

빈도가 아닌 발생 횟수의 일부를 인쇄하고 싶습니다.

0.5 x
0.4 y
0.1 z

(이 작업을 수행하는 Python 프로그램이 있지만 명령줄 자체에서 수행할 수 있는지 알고 싶습니다.)

지금까지 합계를 계산해 보았습니다.

<...>| awk -F" " '{print $1}' | tr '\n' +; echo 0 | bc

5+1+4+0하지만 이것은 계산을 하지 않고 출력만 제공합니다 .

편집: 합계를 얻었습니다. 위의 명령을 다음과 같이 수정했습니다.

<...>| awk -F" " '{print $1}' | echo $(tr '\n' +; echo 0) | bc > sum 

올바른 결과가 합계에 저장됩니다. 이제 원래 목록을 합계로 나누어 표시하고 싶습니다.

답변1

awk '{ f[$2] = $1; SUM += $1} END { for (i in f) { print f[i]/SUM, i } }' </tmp/data

답변2

awk에서는 합산을 할 수 있고, 나눗셈도 할 수 있습니다. bc각 행에 추가 데이터가 있으므로 호출하는 것보다 간단합니다 .

그러면 입력 줄의 첫 번째 필드의 합계가 인쇄됩니다.

awk '{sum += $1} END {print $1}'

따라서 입력 데이터를 저장하고 합계를 계산한 다음 데이터 처리를 계속할 수 있습니다.

data=$(…)
sum=$(printf '%s\n' "$data" | awk '{sum += $1} END {print $1}')
printf '%s\n' "$data" | awk -v sum="$sum" '{ $1 /= sum; print }'

아니면 당신은 수도모든 데이터를 메모리에 유지하면서 awk로 전달합니다..

관련 정보