我被问到这个问题:
文件下面有五行,其中(空白)表示空白行:
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提示。
答案 0 :(得分:3)
您的awk
语法错综复杂,需要{}
代替()
awk 'BEGIN {n=0} /^$/ { n+=1 }END{print "n=" n%2*3}' file
并且您不需要在此处使用cat
,Awk
完全能够直接处理文件。
该命令的作用是什么,
awk
一次处理一行文件内容。 BEGIN{}
子句中的语句在文件处理发生之前运行,因此初始化变量的任何操作都在这里完成。/^$/
是regEx
语法,用于匹配blank
行,因此Awk
处理输入行,如果它看到空行,则{ n+=1 }
部分会增加这些空白事件的数量。 awk
处理完文件时,n
的值将为2
END
是一个类似的子句,在处理完所有输入行后运行。所以这里通常我们操作作为文件处理的一部分存储的变量/数组内容。在这里,我们只需通过n
的模数打印2
的值,然后将该值乘以3