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}'
しかし、私は、1つのif条件を上に配置し、次にその下に配置すると、条件が満たされると思います。 awk ifステートメントを使用してどうすればよいですか?これを行うより良い方法はありますか?
ネストされた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
フィールドセパレータを定義するには、必要に応じてparameter -F,
の代わりにoption FS=,
を使用するか、またはawk
コード内に完全に含めることができます。 、BEGIN{ }
プリファイル処理ブロック:BEGIN{ FS="," }