awk를 사용하여 파일의 각 줄에 있는 숫자를 해당 파일의 가장 큰 값으로 나눕니다.

awk를 사용하여 파일의 각 줄에 있는 숫자를 해당 파일의 가장 큰 값으로 나눕니다.

다음과 같은 파일이 있습니다.

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

여기서 명령이 실패합니다.

더 나은 방법: 임시 파일을 반복하는 대신 다음과 같은 변수에 최대값을 저장합니다.코살로난다의 답변.

관련 정보