awkプログラムの異なるifステートメント内で複数のifステートメントを使用する方法は?

awkプログラムの異なるifステートメント内で複数のifステートメントを使用する方法は?

CSVファイルがありますが、CSVファイルからデータを取得するために何度も確認したいと思います。私は次の条件を知っている必要があり、シェルスクリプトでawkを使用して満足させたいと思います。

if ( ColD == "TRX" || ColD == "TX" )
{
   if (ColJ == "BTS INT UNAFF" || ColJ == "LOCAL MODE")
   {
      if (ColL !="OPER" && ColL != "") #Second Value shouldn't be blank
      {
         if (ColU != "2000")
         {
             if (ColA != "*_*") # Should not contain _ in the value.
             then
                   print all the resulting filtered columns of this csv file

ここで ColA、ColB などは $1、$2 などで使用する列番号です。

これで、単一のif条件の単純なawk使用法が次のようになることがわかります。

awk -F, '{
                if ($23 == "TOP36")
                print $11
            }' $INPUT_PATH/$fileName

そして入れ子になったif条件は次のように見つけることができます。

awk '
{if ( $6 == 0 && $8 > 0 && $8 <= 9 ) { $6 = "left" } else {
  if ( $8 == 0 && $6 > 0 && $6 <= 15 ) { $6 = "bottom" } else {
    if ( $8 == 9 && $6 > 0 && $6 <= 15 { $6 = "top" } else {
      if ( $6 == 15 && $8 > 0 && $8 <= 9 { $6 = "right" }
      }
    }
  }
} {print}'

しかし、上で満足するif条件を入れて、下に等を入れれば私の条件が満足できると思います。 awk ifステートメントを使用してこれをどのように実行できますか?もっと良い方法がありますか?

ベストアンサー1

入れ子になったif氏名効果的に 声明and声明したがって、ネストを段階的に進めるときに特定の処理を実行する必要がない場合は、すべて接続するだけです&&

  awk '{ if( ( $4 == "TRX" || $4 == "TX" ) &&
             ( $10 == "BTS INT UNAFF" || $10 == "LOCAL MODE" ) && 
             ( $12 != "OPER" && $12 != "" ) && # Second Value should not be blank
             ( $22 != "2000") &&
             ( !match( $1, "_") ) ) # Should not contain _ in the value.
           { print } 
       }' FS=, file

フィールド区切り文字を定義するには、次を使用できます。オプション-F,変える範囲FS=,または、必要に応じてコードのファイル前処理ブロックに完全にラップしますawkBEGIN{ }BEGIN{ FS="," }

おすすめ記事