都市名を持つファイルからデータを読み取る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
'
使用
-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を2番目のパラメータとして使用して、次の条件を取得します。
'LCORP%%REGN%変数が渡されたファイルには、$lInputFile
文字列全体と行番号と一致する行が印刷されます。