다음과 같은 파일이 있습니다.
0.0451660231
0.0451660231
0.0527343825
0.3933106065
0.3970947862
0.0489502028
0.3592529595
0.3592529595
0.3592529595
0.3630371392
0.3630371392
0.3668213189
0.4008789659
0.1397705227
각 행을 최대값으로 나누고 싶습니다.
내가 해냈어
cut -f1 -d"," CVBR1_hist | sort -n | tail -1 > maximum
awk -v c=$maximum '{print $1/c}' CVBR1_hist > CVBR1_norm
이 오류가 있습니다.
awk: cmd. line:1: (FILENAME=CVBR1_hist FNR=1) fatal: division by zero attempted
어떻게 해결해야 할지 모르겠습니다. 누가 날 도울 수 있죠?
답변1
CVBR1_hist
파일 내용을 숫자로 정렬하면 올바른 데이터가 생성된다고 가정합니다 .
$ sort -n CVBR1_hist
0.0451660231
0.0451660231
0.0489502028
0.0527343825
0.1397705227
0.3592529595
0.3592529595
0.3592529595
0.3630371392
0.3630371392
0.3668213189
0.3933106065
0.3970947862
0.4008789659
그런 다음 다음과 같은 명령 대체를 사용하여 변수에 최대값을 저장할 수 있습니다.
maximum="$( sort -n CVBR1_hist | tail -n 1 )"
정규화된 값은 다음을 통해 얻을 수 있습니다 awk
.
awk -v m="$maximum" '{ print $1/m }' CVBR1_hist >CVBR1_norm
따라서 누락된 유일한 것은 변수에 최대값을 올바르게 저장하는 것입니다.
답변2
이것은 일회성 awk 솔루션이지만 메모리의 모든 데이터를 배열에 저장합니다. 다음과 같이 실행하세요:awk -f thisprogram.awk < CVBR1_hist > CVBR1_norm
{
elements[NR]=$1
if ($1 > largest) {
largest = $1
}
}
END {
for(i=1; i <= NR; i++)
printf "%.10f\n", elements[i]/largest
}
답변3
awk에서는 변수 "c"가 빈 변수와 동일하게 설정되어 있으므로 오류가 발생합니다. $maximum이 아직 설정되지 않았습니다.
당신이 해야 할 일:
awk -v c=`cat maximum` '{print $1/c}' CVBR1_hist > CVBR1_norm
여기서 명령이 실패합니다.
더 나은 방법: 임시 파일을 반복하는 대신 다음과 같은 변수에 최대값을 저장합니다.코살로난다의 답변.