awk, 열 값을 곱하고 상수와 비교하여 종료하기 전에 첫 번째 일치 항목을 찾습니다.

awk, 열 값을 곱하고 상수와 비교하여 종료하기 전에 첫 번째 일치 항목을 찾습니다.

아래와 같이 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.6e8awk 외부의 코드와 같은 것은 작동하지 않습니다.

0을 준다

  • (축약된 데이터 포함) 첫 번째 행은 조건을 만족하며 maxt0 maxa으로 설정되면 조건이 더 이상 충족되지 않습니다.

값을 저장할 필요가 없습니다(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가 됩니다.

관련 정보