awkコマンドに条件付きで変数を渡すには?

awkコマンドに条件付きで変数を渡すには?

都市名を持つファイルからデータを読み取る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

2つの基本的なオプションがあります。 i)-v転送変数を使用するか、ii) 周囲のawkスクリプトを閉じ、シェル変数を使用して再度続行します。'awk'

  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を2番目のパラメータとして使用して、次の条件を取得します。

'LCORP%%REGN%変数が渡されたファイルには、$lInputFile文字列全体と行番号と一致する行が印刷されます。

関連情報