2014-01-17 74 views
1

我想了解shell脚本中的gawk。下面的命令试图根据标记段落结尾的两个(或更多)连续的新行来计算段落的数量。awk命令的含义

gawk 'END{print "Number of paragraphs: "NR}' RS="" tmp.txt 

它是如何工作的? RS的

+1

你可能从一个实际的问题陈述开始,你正在尝试做什么... –

+0

@Ryan J它应该计算段数? – john

+0

基于两个连续的新行 – john

回答

3

的GNU awk手册说:

空字符串""(没有任何字符的字符串)具有特殊的含义如RS的值 。这意味着记录由一个或多个空白行分隔,而没有其他内容。

所以,你的程序可以分析如下:

gawk 'END{print "Number of paragraphs: "NR}' RS="" tmp.txt 
  1. 运行gawk命令。
  2. gawk脚本是END{print "Number of paragraphs: "NR}(单引号被shell删除)。当输入结束时,它将输出一个短语之前的NR值。 NR是读取的记录数。请注意,这是在短语和NR之间使用隐式连接运算符。它也可以写成print "Number of paragraphs:", NR,它会产生相同的结果。
  3. RS=""实际上由gawk看作RS=(双引号被shell删除)。这设置了手册中引用的特殊模式。在这里,两个或更多连续的换行符将被计为段落的结尾,EOF也是如此。
  4. 处理的文件是tmp.txt

因此,由于gawk内置了一个特殊情况,该命令正常工作。

本讨论中的所有内容也适用于标准awk

+0

但是''string“”something“''和''string”,“something”'是不一样的:一个是“纯”串联,后者把字段分隔符放在片段之间。 (刚通过测试检查) – ShinTakezou

+0

是的,它们是不同的。您可能会注意到,在我提出的替代方案中,在冒号后没有空格 - 由于用逗号分隔参数,因此在两个参数(“短语”和NR)之间插入OFS(输出字段分隔符)字符。问题中的印刷陈述有一个论点;修订有两个。 –

+0

so RS =“”menas whats? – john