AWK는 방정식 표현식에 변수를 사용합니다.

AWK는 방정식 표현식에 변수를 사용합니다.

내 코드의 단순화된 버전은 다음과 같습니다.

declare -a DMN=(" " "200" "190" "180")
NRL=3

runDHFiles()
{
awk 'NR>13 {if ($4==$DMN[$i]) print $1, $2, $3, $4;}' domain_all.dat >> ddh_domain_${DMN[$i]}.dat
}

for ((i = 1; i <= NRL; i++ )); do
   runDHFiles
done

대용량 Excel 파일을 반복하면서 필드 플래그(열 4)가 특정 숫자와 같은 행을 복사하려고 합니다.

이렇게 하면 훌륭하게 작동합니다.

if ($4==200)

이렇게 하면 작동하지 않습니다.

if ($4==$DMN[$i])

루프에서 같음 문의 배열 값에 어떻게 액세스합니까?

감사해요,

강간

답변1

한 가지 옵션은 셸 변수를 에 전달하여 awk다시 참조하는 것을 방지하는 것입니다.

awk 'NR>13 {if ($4==dmn) print $1, $2, $3, $4;}' dmn="${DMN[$i]}" domain_all.dat >> ddh_domain_${DMN[$i]}.dat

나는 또한 쉘 함수에 변수를 전달하기 위해 쉘 스크립트를 리팩터링하는 경향이 있습니다.

declare -a DMN=(" " "200" "190" "180")
NRL=3

runDHFiles()
{
    local dmn="$1"
    awk 'NR>13 && $4==dmn {print $1, $2, $3, $4;}' dmn="$dmn" domain_all.dat >> "ddh_domain_${dmn}.dat"
}

for ((i=1; i<=NRL; i++ ))
do
   runDHFiles "${DMN[$i]}"
done

답변2

bash 배열 변수를 "볼" 수 있도록 참조를 변경하면 개선됩니다.

awk 'NR>13 {if ($4=="'"$DMN[$i]"'") print $1, $2, $3, $4;}' domain_all.dat >> ddh_domain_${DMN[$i]}.dat

즉, 작은따옴표 부분을 일시적으로 종료합니다(그리고 큰따옴표를 사용하여 문자열로 만듭니다 awk).

-v또는 (일부 사람들은 선호함) 변수를 선언하는 옵션을 사용한 다음 다음을 사용하는 것입니다.awk저것스크립트에서:

awk -v value=DMN[$i] 'NR>13 {if ($4==value) print $1, $2, $3, $4;}' domain_all.dat >> ddh_domain_${DMN[$i]}.dat

관련 정보