값 열의 최소값과 최대값을 찾고 -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
있습니다 . 이것이 일치하면 첫 번째 파일을 처리하는 것입니다. 즉, 이 블록은 첫 번째 파일에 대해서만 실행됩니다.NR
FNR
if ($1>=max) max=$1
- awk
문 if
구문은 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
대신 사용했습니다...) 데이터를 인쇄합니다.