如何带条件将变量传递给 awk 命令?

如何带条件将变量传递给 awk 命令?

我有一个 while 循环,它从带有城市名称的文件中读取数据:

城市名称:

COIMBATORE
MADURAI
PONDICHERRY
SALEM
TRIPUR
TIRUCHI
TIRUNELVELI
TUTUCORIN
VELLORE

awkwhile循环中使用命令并尝试在语句中再次读取 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 变量并'再次继续。

  1. 使用-v

    while read city
    do
        awk -v city="$city" -F, '{
                                  if ( $1 == "ACTIVE"  && $2 == city ){print $1}
                                 }' siteDBName >> count
    done < city_name
    
  2. 关闭报价

    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,将打印与整个字符串与行号匹配的行。

相关内容