awk: 특정 필드에서 연산이 작동하지 않습니다

awk: 특정 필드에서 연산이 작동하지 않습니다

다음과 같은 몇 줄이 있습니다.

N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0

마지막에서 세 번째 필드를 와 함께 작동하지 않는 요소로 바꿔야 합니다 awk. 그러나 마지막 필드나 마지막 필드에서 두 번째 필드에 동일한 표현식을 적용하면 작동합니다. 과학적 표기법 및 각각을 사용하여 테스트했는데 awk작동합니다. 예는 다음과 같습니다:

#works as expected; last field gets multiplied by -1
echo "N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0" | awk '{gsub($(NF),-1.0*$(NF))};{print}'
N2O       + M       = N2       + O     + M          1.300E+11  0.00  -59620

#does not work; third from last field stays unchanged
echo "N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0" | awk '{gsub($(NF-2),-1.0*$(NF-2))};{print}'
N2O       + M       = N2       + O     + M          1.300E+11  0.00  59620.0

왜 이런 일이 발생하는지에 대한 제안이 있으십니까?

답변1

답은 다음에서 찾을 수 있습니다.인간의 awk:

대체를 통해 숫자 표현식을 문자열로 변환표현와 함께 sprintf(CONVFMT, expr), 그렇지 않은 경우표현호스트 시스템에서 정확한 정수로 표현된 다음 sprintf("%d", expr).
파편()sprintf(3)의 기능을 복사하는 AWK 내장 함수입니다.컨벌루션 FMT는 숫자를 문자열로 내부 변환하는 데 사용되는 내장 변수이며 로 초기화됩니다 "%.6g".

gsub따라서 문자열 조작을 사용하는 함수를 호출하면필드가 변환되지만 sprintf("%d", 1.300E+11)130000000000에 해당 텍스트가 없으므로 대체가 필요하지 않습니다.

관련 정보