도시 이름이 있는 파일에서 데이터를 읽는 while 루프가 있습니다.
도시 이름:
COIMBATORE
MADURAI
PONDICHERRY
SALEM
TRIPUR
TIRUCHI
TIRUNELVELI
TUTUCORIN
VELLORE
awk
루프 에서 명령을 사용 하고 명령문 while
에서 while 루프 본문에 정의된 변수를 다시 읽으려고 시도했지만 awk
작동하지 않고 오류가 발생했습니다. 내가 아는 바로는 변수의 사용법을 이해하고 그 값을 읽을 수 awk
있도록 변수 본문을 별도로 정의해야 합니다 .awk
내 while 루프는 다음과 같습니다.
while read city
do
awk -F, '{
if ( $1 == "ACTIVE" ) &&
( $2 == "$city" )
print $1
}' siteDBName >> count
SUM=`awk '{ sum += $1 } END { print sum }' count`
done < city_name
siteDBName 파일에는 아래와 같이 여러 데이터 열이 포함되어 있습니다.
사이트 데이터베이스 이름:
ACTIVE,COIMBATORE,MGT500,1,5,7....
INACTIVE,MADURAI,GT500,5,6,7...
ACTIVE,SALEM,TR600,6,4,6...
ACTIVE,COIMBATORE,GT500,4,5,6...
..
..
awk -v c=$city
여기서는 나머지 명령문과 함께 이를 사용하려고 시도했지만 이로 인해 오류가 발생했습니다.
while 루프 내의 awk 문 내에서 while 루프에서 사용되고 초기화된 변수를 어떻게 사용할 수 있습니까?
답변1
두 가지 기본 옵션이 있습니다. i) -v
전달 변수를 사용하거나 ii) 주변의 awk
스크립트를 닫고 셸 변수를 사용하고 다시 계속합니다.'
awk
'
사용
-v
while read city do awk -v city="$city" -F, '{ if ( $1 == "ACTIVE" && $2 == city ){print $1} }' siteDBName >> count done < city_name
견적 닫기
while read city do awk -F, '{ if ( $1 == "ACTIVE" && $2 == "'$city'" ){print $1} }' siteDBName >> count done < city_name
SUM=
그 줄은 유용한 일을 하지 않아서 $1
추가할 ACTIVE
필요가 없었기 때문에 제거했습니다 . 이 작업을 올바르게 수행하는 방법은 아래 대안을 참조하세요.
siteDBName
또한 이 접근 방식을 사용하면 파일을 여러 번 읽어야 한다는 점에 유의하세요 . 보다 효율적인 버전은 다음과 같습니다.
$ awk -F, '{
if(NR==FNR){cities[$1]++;}
else if($1=="ACTIVE" && $2 in cities ){sum++}
} END{print sum,"active cities"}' city_name siteDBName
3 active cities
답변2
@cuonglm과 @YoMismo가 말했듯이 잘못된 변수와 잘못된 인용 방식을 사용하고 있습니다. 다음과 같아야 합니다.
while read city
do
awk -v c="$city" -F, '{
if ( $1 == "ACTIVE" && $2 == c )
print $1
}' siteDBName >> count
SUM=`awk '{ sum += $1 } END { print sum }' count`
done < city_name
답변3
SUM에만 관심이 있다면
grep -cf <(sed s/^/\^ACTIVE,/ city_name) siteDBName
또는 대용량 파일의 경우
grep -f city_name siteDBName | grep -c ^ACTIVE
답변4
아래에서 시도해보세요
awk '/1CORP/ && /'$Param1'/ && /REGN/ && /'$Param2'/{print NR":"$0}' $lInputFile
위 명령은 $Param1을 첫 번째 매개변수로, $Param2를 두 번째 매개변수로 사용하여 다음 조건을 검색합니다.
'LCORP%%REGN% 변수가 전달된 파일에는 $lInputFile
전체 문자열 및 줄 번호와 일치하는 줄이 인쇄됩니다.