내 코드의 단순화된 버전은 다음과 같습니다.
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