运行awk命令时出现问题

时间:2017-03-18 06:49:44

标签: bash awk

我被问到这个问题:

  

文件下面有五行,其中(空白)表示空白行:

alpha
(blank)
beta
(blank)
alpha beta
     

基于此,当执行以下bash命令时,以下哪项是输出?

cat file | awk 'BEGIN ( n=0 ) /^$/ ( n+=1 ) END ( print "n=" n%2*3 )'

当我尝试创建文件并运行上面的命令时,我遇到了很多错误:

sh-4.2$ cat test.txt | awk 'BEGIN ( n=0 ) /^$/ ( n+=1 ) END ( print "n=" n%2*3 )'                                                                               
awk: cmd. line:1: BEGIN ( n=0 ) /^$/ ( n+=1 ) END ( print "n=" n%2*3 )                                                                                          
awk: cmd. line:1:       ^ syntax error                                                                                                                          
awk: cmd. line:1: BEGIN ( n=0 ) /^$/ ( n+=1 ) END ( print "n=" n%2*3 )                                                                                          
awk: cmd. line:1:                ^ syntax error                                                                                                                 
awk: cmd. line:1: BEGIN ( n=0 ) /^$/ ( n+=1 ) END ( print "n=" n%2*3 )                                                                                          
awk: cmd. line:1:                   ^ unterminated regexp                                                                                                       

你能帮我解决awk命令的作用以及为什么我会收到所有这些错误吗?

我正在使用在线unix shell提示。

1 个答案:

答案 0 :(得分:3)

您的awk语法错综复杂,需要{}代替()

awk 'BEGIN {n=0} /^$/ { n+=1 }END{print "n=" n%2*3}' file

并且您不需要在此处使用catAwk完全能够直接处理文件。

该命令的作用是什么,

  1. 通常awk一次处理一行文件内容。 BEGIN{}子句中的语句在文件处理发生之前运行,因此初始化变量的任何操作都在这里完成。
  2. /^$/regEx语法,用于匹配blank行,因此Awk处理输入行,如果它看到空行,则{ n+=1 }部分会增加这些空白事件的数量。
  3. 因此,当awk处理完文件时,n的值将为2
  4. END是一个类似的子句,在处理完所有输入行后运行。所以这里通常我们操作作为文件处理的一部分存储的变量/数组内容。在这里,我们只需通过n的模数打印2的值,然后将该值乘以3