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로 전달합니다..