아래와 같이 6개의 데이터 열이 있는 data2process.tempdata 파일이 있습니다.
# Angle(deg) D1 D2 D3 D4 D5
0.50 0.00E+00 0.00E+00 1.97E-10 3.94E-09 1.97E-10
1.00 0.00E+00 0.00E+00 1.70E-10 3.41E-09 1.70E-10
1.50 0.00E+00 0.00E+00 1.30E-10 2.59E-09 1.30E-10
2.00 0.00E+00 0.00E+00 9.49E-11 1.90E-09 9.49E-11
2.50 0.00E+00 0.00E+00 6.99E-11 1.40E-09 6.99E-11
3.00 0.00E+00 0.00E+00 5.27E-11 1.05E-09 5.27E-11
3.50 0.00E+00 0.00E+00 4.12E-11 8.23E-10 4.12E-11
4.00 0.00E+00 0.00E+00 3.33E-11 6.66E-10 3.33E-11
4.50 0.00E+00 0.00E+00 2.78E-11 5.56E-10 2.78E-11
5.00 0.00E+00 0.00E+00 2.37E-11 4.74E-10 2.37E-11
여섯 번째 열(D5)에 3.6E8을 곱하고 곱이 0.05보다 작거나 같은 첫 번째 인스턴스를 찾고 싶습니다. 이 시점에서 첫 번째 열에 해당 값을 저장하고 인쇄한 후 종료하려고 합니다. 위에 표시된 (편집된) 데이터에서 첫 번째 인스턴스는 1.5도(1.3e-10*3.6e8=0.0468)에서 조건이 충족되는 경우이지만 그 이후에도 마찬가지입니다. 따라서 echo $maxangle은 조건을 충족하는 마지막 항목인 5.0이 아니라 1.5여야 합니다.
awk 버전은 GNU Awk 5.0.1, API: 2.0(GNU MPFR 4.0.2, GNU MP 6.2.0)입니다.
다음 awk 명령을 사용하려고 합니다.
maxangle=$(awk -v maxt=0.05; $6 *=3.6e8 '{if($6<=maxt){maxt=$6; maxa=$1}}END{print maxa ; exit} ' data2process.tempdata)
오류가 발생합니다. *=3.6e8: command not found
maxangle=$(awk -v maxt=0.05 v6="$arg6"*3.6e8 '{if($v6<maxt){maxt=$1; maxa=$1}}END{print maxa ; exit} ' data2process.tempdata)
주어진v6=*3.6e8 syntax error
maxangle=$(awk -v maxt=0.05 '{$6 = $6 * 3.6e8 ; if($6<=maxt){maxt=$1; maxa=$1}} END{print maxa ;}' data2process.tempdata)
echo $maxangle
5.0 주세요.
도움을 주셔서 감사합니다. 나는 그것들을 모두 사용할 수 있다고 확신합니다.
답변1
0.05 상수를 3.6E8로 나누면 6번 필드와 직접 비교할 수 있는 값이 나옵니다. 이렇게 하면 매우 큰 값과 매우 작은 값을 비교할 때 수치 언더플로나 정밀도 손실 가능성이 방지됩니다.
awk -v maxt=0.05 '
BEGIN { tdash = maxt / 3.6E8 }
NR>1 && $6 < tdash { print $1; exit }
' data2process.tempdata
답변2
그래 알았어.
당신은 다음과 같은 것을 원합니다
awk -v maxt=0.05 '{t6 = $6 * 3.6e8 ;
if(t6<=maxt){maxt=$1; maxa=$1}}
END{print maxa ;}' data
파일에서 얻은 값을 곱하려면 awk 내부에 있어야 하므로 v6="$arg6"*3.6e8
awk 외부의 코드와 같은 것은 작동하지 않습니다.
0을 준다
- (축약된 데이터 포함) 첫 번째 행은 조건을 만족하며
maxt
0maxa
으로 설정되면 조건이 더 이상 충족되지 않습니다.
값을 저장할 필요가 없습니다(awk에서 다른 계산을 수행하지 않는 한).
awk -v maxt=0.05 '$6 * 3.6e8 <= maxt {print $1 ; exit ;}' data
어디
-v maxt=0.05
할당maxt
$6 * 3.6e8 <= maxt
성공 조건을 테스트하기 전{
(awk에서는 "패턴"이라고 함){print $1 ; exit ;}
찾은 값을 인쇄하고 종료합니다. (이것을 awk에서는 "액션"이라고 합니다)
새로운 데이터를 사용하면 1.5가 됩니다.