2012-10-25 42 views
8

關於AND邏輯運算符的一個基本問題。我試圖根據列1和列2的值在數據文件niveles.csv中提取一些字段。我想寫一個awk語句,說「當field1 = date和field2 = area,然後打印字段3到5」 。Awk AND運算符

我的數據文件看起來像

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

bash腳本中的awk句話

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

但這只是給出了三種情況下的區域編號有8場裏面(8,18和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腳本訪問shell變量的值,請參閱http://cfajohnson.com/shell/cus-faq-2.html#Q24,並參閱@ Barmar的答案。 –

+0

@EdMorton:我同意這不是訪問shell變量的正確方法......提供解決方案以使OP的解決方案工作... – Guru

9

使用awk的-v選項來創建包含shell變量的awk變量。

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

這應該是好的,我給它一個小測試:

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

如果你想要的日期和麪積領域中有那麼AWK語句如下所示:

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

非常好的解決方案,謝謝 – pacomet

+1

不,不要那樣做!有關如何從awk腳本訪問shell變量的值,請參閱cfajohnson.com/shell/cus-faq-2.html#Q24,並參閱@ Barmar的答案。 –

5

由於這個問題因其標題而備受關注,讓我發佈一個更通用的答案,涵蓋如何在awk中使用AND運算符。

假設你有一個文件myfile

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

如果你正在尋找一種方式使用AND運營商做一些多張支票,你需要使用&&這樣的:

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

將返回:

b 4 5 6 
c 7 8 9 

在一般情況下,只要你想,你可以使用盡可能多的情況下,考慮到

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

所以,你可以將多個邏輯表達式例如像:

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