要由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如何读取和切割以及处理具有模式和操作的字段的详细信息的手册?感谢。
答案 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
}