값 열의 최소/최대를 찾고 해당 값을 모든 열 번호에 추가하는 방법은 무엇입니까?

값 열의 최소/최대를 찾고 해당 값을 모든 열 번호에 추가하는 방법은 무엇입니까?

값 열의 최소값과 최대값을 찾고 -1*min() 값을 모든 열 값에 추가하는(효과적으로 내 데이터를 0으로 만드는) 이 awk 명령에 대한 올바른 구문을 찾을 수 없는 것 같습니다. ). 어떤 도움이라도 대단히 감사하겠습니다! 매우 감사합니다!

awk 'NR==1 {max=$2; min=$2} $2>=max {max=$2} $2<=min {min=$2}' <  my_data.dat | awk '{printf("%-5d%+13.5f \n", NR, $2+(-1*min))}'  > my_new_data.dat

답변1

여러 파일과 동일한 구문을 사용하여 파일을 두 번 찾아볼 수 있으며 동일한 파일은 두 번만 사용할 수 있습니다.

awk 'NR==1 { max=$1 ; min=$1 }
     FNR==NR { if ($1>=max) max=$1 ; $1<=min?min=$1:0 ; next}
     { $2=($1-min)/(max-min) ; print }' file file

상해:

NR==1 { max=$1 ; min=$1 }- 이미 수행한 첫 번째 레코드의 값을 가져옵니다.

FNR==NR- 여러 입력 파일의 경우 전체 레코드 색인 번호에 대한 값(즉, 모든 파일이 연결된 것처럼)과 현재 파일의 레코드 색인 번호에 대한 값이 awk있습니다 . 이것이 일치하면 첫 번째 파일을 처리하는 것입니다. 즉, 이 블록은 첫 번째 파일에 대해서만 실행됩니다.NRFNR

if ($1>=max) max=$1- awkif구문은 if (condition) action ; else if (condition) action ; else action분명 if else하며 else문은 선택 사항입니다.

$1<=min?min=$1:0- 및 대체 if명령문 구문: condition?yes-action:no-action.이 작업에는 다른 작업이 필요하므로 의미가 없습니다 0. 단지 당신의 관심을 위해서입니다.

next- 두 번째 파일에 대해서만 다음 블록이 실행되도록 다음 파일로 점프합니다.

$2=($1-min)/(max-min) ; print- [0,1]을 정규화하고(귀하의 예에서는 유용하지 않으므로 max대신 사용했습니다...) 데이터를 인쇄합니다.

관련 정보