Awk AND运算符

时间:2012-10-25 11:24:33

标签: awk

关于AND逻辑运算符的基本问题。我试图根据第1列和第2列的值在我的数据文件niveles.csv中提取一些字段。我想写一个awk句子说“当field1 = date和field2 = area然后打印字段3到5”

我的数据文件看起来像

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

提前感谢您的关注,对于有经验的用户来说,这肯定是一个简单的问题。

4 个答案:

答案 0 :(得分:13)

未经测试:

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

$ 2~ / 8 / - >这意味着如果第二个字段包含8

$ 2 == 8 - >这意味着如果第二个字段等于8

答案 1 :(得分:11)

使用awk的-v选项创建包含shell变量的awk变量。

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

答案 2 :(得分:9)

由于这个问题因其标题而受到很多关注,让我发一个更通用的答案,介绍如何在AND中使用awk运算符。 < / p>

假设您有一个文件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
#    ^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^

答案 3 :(得分: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