我有一个 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
将变量传递给awk
或 ii) 关闭脚本'
周围awk
,使用 shell 变量并'
再次继续。
使用
-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
,将打印与整个字符串与行号匹配的行。