2012-10-25 12 views
8

AND論理演算子についての基本的な質問。私はデータファイルniveles.csvの列1と2の値に基づいていくつかのフィールドを抽出しようとしています。私はawkの文章を書いてみたいと思います "フィールド1 =日付とfield2 = 。Awk AND演算子

bashスクリプト内の

01-08-12;1;0;0;0 
01-08-12;2;1;1;1 
01-08-12;3;0;0;1 
................ 

awkの文が

date=01-08-2012 
area=8 
awk 'BEGIN {FS=";"} $1 ~ /'$date'/ && $2 ~ /'$area'/ { print $1 " " $2 " " $3 " " $4 " " $5 }' niveles-rams.cs 

である。しかし、これは単なる8,18(エリア数が8の内側を持っている3例のためのフィールドを与えるように私のデータファイルを検索しますそして28)私はちょうど8区域のデータだけを望んでいるのです

01-08-2012 8 0 0 0 
01-08-2012 18 2 2 1 
01-08-2012 28 2 1 0 

あなたの注意のために前もってありがとう経験豊富なユーザーにとっては簡単な質問です。

答えて

7

は未テスト:

awk 'BEGIN {FS=";"} $1 ~ /'$date'/ && $2 == '$area'{......}' 

$に2〜/ 8/- >第二フィールドが含まれている場合、これは意味8

$ 2 == 8 - >第二フィールドは8

+0

感謝、私は〜と==の違いを認識していなかった – pacomet

+3

いいえ、それをしないでください!シェル変数の値にアクセスしてawkスクリプトを作成する方法については、http://cfajohnson.com/shell/cus-faq-2.html#Q24を参照し、ここで@ Barmarの答えを参照してください。 –

+0

@EdMorton:これはシェル変数にアクセスする正しい方法ではないことに同意します...解決策はOPのソリューションを動作させるために提供されています... – Guru

9
に等しい場合、これは意味

awkの-vオプションを使用して、シェル変数を含むawk変数を作成します。

awk -v date="$date" -v area="$area" '$1 == date && $2 == area { ... }' 
0

これは、[OK]をする必要があり、私はそれを少しテスト与えた:あなたはそこに日付と地域のフィールドをしたい場合は、awkの文は次のようになります

date="01-08-12" 
area=8 
awk -F\; '$1 == "'$date'" && $2 == '$area' { print $3 " " $4 " " $5 }' niveles-rams.csv 

を:

awk -F\; '$1 == "'$date'" && $2 == '$area' { print $1 " " $2 " " $3 " " $4 " " $5 }' niveles-rams.csv 
+0

非常にいい解決策、ありがとう – pacomet

+1

いいえ、それをしないでください!シェル変数の値にアクセスしてawkスクリプトを作成する方法については、cfajohnson.com/shell/cus-faq-2.html#Q24を参照してください。ここで@ Barmarの答えをご覧ください。 –

5

タイトルのためにこの質問に多くの注目が集まっているので、awkAND演算子を使用する方法について、より一般的な回答を投稿してください。

a 1 2 3 
b 4 5 6 
c 7 8 9 

あなたがAND演算子を使用して、いくつかの複数のチェックを行う方法を探しているなら、あなたはこのような&&を使用する必要があります:

awk '$2 < 10 && $3 > 2' myfile 

は、ファイルmyfileを持っていると言います

返すもの:

b 4 5 6 
c 7 8 9 

あなたが望むような一般的に、あなたは

AND --> && 
OR --> || 

ですから、例えばのような複数の論理式を組み合わせることができていることを考慮し、できるだけ多くの条件を使用することができますが:

awk '($2 < 10 || $3 > 2) && ($2 > 10 || $3 < 2)' myfile 
# ^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^