Awk AND运算符

pac*_*met 15 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
................
Run Code Online (Sandbox Code Playgroud)

bash脚本中的awk句子是

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

但这只是给出了区域编号有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
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的关注,对于有经验的用户来说,这肯定是一个简单的问题.

Gur*_*uru 14

未经测试:

awk 'BEGIN {FS=";"}  $1 ~ /'$date'/ && $2 == '$area'{......}'
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不,不要那样做!有关如何从awk脚本访问shell变量的值,请参阅http://cfajohnson.com/shell/cus-faq-2.html#Q24,并在此处查看@ Barmar的答案. (4认同)
  • 有一天,给他一个不会在密码上失败的解决方案不是更好吗? (3认同)

Bar*_*mar 11

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

awk -v date="$date" -v area="$area" '$1 == date && $2 == area { ... }'
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 9

由于这个问题由于它的标题而引起了很多关注,所以让我发布一个更通用的答案,涵盖如何使用AND运算符awk.

假设你有一个文件myfile:

a 1 2 3
b 4 5 6
c 7 8 9
Run Code Online (Sandbox Code Playgroud)

如果您正在寻找使用AND运算符进行多项检查的方法,则需要使用&&如下:

awk '$2 < 10 && $3 > 2' myfile
Run Code Online (Sandbox Code Playgroud)

哪个会回归:

b 4 5 6
c 7 8 9
Run Code Online (Sandbox Code Playgroud)

通常,您可以根据需要使用任意数量的条件

AND --> &&
OR  --> ||
Run Code Online (Sandbox Code Playgroud)

因此,您可以组合多个逻辑表达式,例如:

awk '($2 < 10 || $3 > 2) && ($2 > 10 || $3 < 2)' myfile
#    ^^^^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)