为什么最后一个新线字符没有被替换

时间:2013-12-04 04:24:49

标签: awk

要由awk处理的文件。

hello world
hello Jack
hello Jim

Hello Marry
Hello Bob
Hello Everyone

我的命令是awk 'BEGIN{RS=""; FS="\n";} {gsub("\n","@"); print}'。 awk手册说当RS设置为null(空?)字符串时,记录由空行分隔。所以结果预计是

hello world@hello Jack@hello Jim@
hello Marry@hello Bob@hello Everyone@

但实际上,结果是

hello world@hello Jack@hello Jim
hello Marry@hello Bob@hello Everyone

最后一个换行符未被@取代。是因为当awk读取并将内容剪切到字段时,awk会忽略记录的最后一个新行字符吗?是否有一些关于awk如何读取和切割以及处理具有模式和操作的字段的详细信息的手册?感谢。

2 个答案:

答案 0 :(得分:2)

您在输出中没有尾随@的原因是:

  • 如果您设置RS="",它与RS="\n\n+"类似(*但有区别,我稍后会解释)。因此,awk将使用最长(> = 2)个连续换行符作为RS

  • Jim有两个\n之后查看您的数据,直到下一个文本块。所以awk会将两个\n作为RS,因此记录中的没有结尾\n(Jim记录)。当然,您的gsub不会取代它。您会在输出中看到换行符,它是由print

  • 带来的
  • 输出中的第二行也没有结尾@,因为我们使用的是RS=""而不是RS="\n\n+"。重要的区别在于,对于RS="",输入数据文件中的前导换行符将被忽略,如果文件在最后一条记录后没有多余的空白行结束,则会从记录中删除最终换行符。这就是输出行#2中没有尾随@的原因。

如果您将其更改为RS="\n\n+",则应在输出的第二行看到结尾@

我想你想知道为什么你得到的输出不是你想要的。但不是试图达到预期的产量,对吗?如果你的问题是如何获得输出,我会编辑我的答案。

答案 1 :(得分:1)

您可以查看此页面:http://www.gnu.org/software/gawk/manual/gawk.html#Multiple-Line

它说: “当RS设置为空字符串,并且FS设置为单个字符时,换行符始终充当字段分隔符。”

因此,您不必指定FS=\n,如果您说RS="",它会自动发生..

为了产生您的预期输出,您可以执行以下操作:

BEGIN{
    RS=""
} 
{
    $0=$0 ORS
    gsub("\n","@")
    print
}