17

关于 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

4 回答 4

15

未测试:

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

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

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

于 2012-10-25T11:34:13.813 回答
11

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

awk -v date="$date" -v area="$area" '$1 == date && $2 == area { ... }'
于 2012-10-25T12:00:55.213 回答
11

由于这个问题因其标题而受到广泛关注,所以让我发布一个更通用的答案,涵盖如何ANDawk.

假设您有一个文件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
#    ^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^
于 2015-10-13T13:47:30.727 回答
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
于 2012-10-25T12:24:32.787 回答