Linux 在awk中,为什么RS参数的“”和“\n\n”处理相同?

Linux 在awk中,为什么RS参数的“”和“\n\n”处理相同?,linux,unix,awk,Linux,Unix,Awk,以下是该文件的内容: Person Name 123 High Street (222) 466-1234 Another person 487 High Street (523) 643-8754 这两件事给出了相同的结果: $ awk 'BEGIN{FS="\n"; RS="\n\n"} {print $1, $3}' file_contents 在这两种情况下给出的结果是: Person Name (222) 466-1234 Another person (523) 643-87

以下是该文件的内容:

Person Name
123 High Street
(222) 466-1234

Another person
487 High Street
(523) 643-8754

这两件事给出了相同的结果:

$ awk 'BEGIN{FS="\n"; RS="\n\n"} {print $1, $3}' file_contents
在这两种情况下给出的结果是:

Person Name (222) 466-1234
Another person (523) 643-8754
RS=\n\n实际上是有道理的,但是为什么RS=也被以同样的方式对待呢?

因为这样说

如果RS为空,则记录由一个加一个或多个空行组成的序列分隔,前导或尾随空行不应在输入的开始或结束处产生空记录,并且a应始终是字段分隔符,无论FS的值是什么

因为他这么说

如果RS为空,则记录由一个加一个或多个空行组成的序列分隔,前导或尾随空行不应在输入的开始或结束处产生空记录,并且a应始终是字段分隔符,无论FS的值是什么


他们的待遇不一样

RS=在所有AWK中调用段落模式,因此输入被拆分为由连续的空行序列分隔的记录,如果现有FS为单字符,则向FS添加换行符注意:POSIX标准在这方面不正确,因为它意味着\n将添加到任何FS,但事实并非如此,请参阅。 RS=\n\n在GNU awk中工作,将记录分隔符设置为单个空行,并且不影响FS。在所有其他AWK中,每个POSIX的RS is未定义行为中的第2个\n字符将被忽略超过1个字符,因此他们可以执行任何操作,但这是目前最常见的实现。 查看当您的两个文本块之间有3个空行,并且使用FS而不是\n时会发生什么情况,例如:


请注意NR和NF的不同值以及打印的不同$0内容。

它们的处理方式不同

RS=在所有AWK中调用段落模式,因此输入被拆分为由连续的空行序列分隔的记录,如果现有FS为单字符,则向FS添加换行符注意:POSIX标准在这方面不正确,因为它意味着\n将添加到任何FS,但事实并非如此,请参阅。 RS=\n\n在GNU awk中工作,将记录分隔符设置为单个空行,并且不影响FS。在所有其他AWK中,每个POSIX的RS is未定义行为中的第2个\n字符将被忽略超过1个字符,因此他们可以执行任何操作,但这是目前最常见的实现。 查看当您的两个文本块之间有3个空行,并且使用FS而不是\n时会发生什么情况,例如:


请注意NR和NF的不同值以及打印的不同$0内容。

仅供参考,POSIX标准错误地指出,无论FS的值是什么,只有当FS是单个字符时,才会添加换行符。他们已经收到通知,如果您介意,请参阅背景资料。@Ed谢谢您提供的信息。我将保留我的答案,因为POSIX标准尚未修复它。仅供参考,POSIX标准错误地说,无论FS的值是什么,只有当FS是单个字符时,才会添加换行符。他们已经收到通知,如果您介意,请参阅背景资料。@Ed谢谢您提供的信息。我将保留我的答案,因为POSIX标准尚未修复它。如果我们像在第一个示例中那样设置FS=,我会期望文件的所有内容都是一条记录,因为没有实例,\n您说过POSIX对单字符FS做的是这样的,添加一个\n,它将在EOF结束记录。为什么有两条记录?提供-posix选项有什么不同?从我在这里读到的:gnu.org/software/gawk/manual/html_node/Options.html它只是禁用了一系列gawk特性以与POSIX兼容。gawk-posix=awk吗?为什么要用另外两个例子来具体说明这个选项?此外,这可能是相关的,但您能否澄清GNU awk和所有awk之间的区别?搜索不会产生任何有用的结果。@herophant将\n添加到FS并不意味着更改,改为,\n,它意味着更改,改为[,\n],即。**或者**,`或者\n不分隔字段,后跟\n。添加-posix将禁用包括多字符RS在内的gawk功能,因此RS=\n\n表示RS=\n。gawk、mawk、tawk、BSD awk、nawk、/usr/xpg4/bin/awk和busybox awk,我敢肯定其他人都像747一样awk,空客和Learjet都是飞机。所以gawk是awk,gawk-posix也是awk。是的,你是对的,awk和gawk在我的系统上是一样的。谢谢您的详细解释。@EdMorton,++ve获得了很好的信息Ed先生,谢谢您的分享。如果我们像第一个示例中那样设置FS=,我会希望文件的所有内容都是一条记录,因为没有实例,\n您说POSIX对单字符FS做的是这样的,添加一个\n,它将在EOF结束记录。为什么有两条记录?提供-posix选项有什么不同?我在这里读到:gnu.org/software/gawk/manual/html\u node/Options.html it
只需禁用一系列与POSIX兼容的gawk功能。gawk-posix=awk吗?为什么要用另外两个例子来具体说明这个选项?此外,这可能是相关的,但您能否澄清GNU awk和所有awk之间的区别?搜索不会产生任何有用的结果。@herophant将\n添加到FS并不意味着更改,改为,\n,它意味着更改,改为[,\n],即。**或者**,`或者\n不分隔字段,后跟\n。添加-posix将禁用包括多字符RS在内的gawk功能,因此RS=\n\n表示RS=\n。gawk、mawk、tawk、BSD awk、nawk、/usr/xpg4/bin/awk和busybox awk,我敢肯定其他人都像747一样awk,空客和Learjet都是飞机。所以gawk是awk,gawk-posix也是awk。是的,你是对的,awk和gawk在我的系统上是一样的。谢谢您的详细解释。@EdMorton,++ve获得了很好的信息,Ed先生,谢谢您的分享。
Person Name (222) 466-1234
Another person (523) 643-8754
$ cat file
Person Name
123 High Street
(222) 466-1234



Another person
487 High Street
(523) 643-8754
$ gawk 'BEGIN{FS=","; RS=""} {print NR, NF, "<" $0 ">\n"}' file
1 3 <Person Name
123 High Street
(222) 466-1234>

2 3 <Another person
487 High Street
(523) 643-8754>
$ gawk --posix 'BEGIN{FS=","; RS=""} {print NR, NF, "<" $0 ">\n"}' file
1 3 <Person Name
123 High Street
(222) 466-1234>

2 3 <Another person
487 High Street
(523) 643-8754>
$ gawk 'BEGIN{FS=","; RS="\n\n"} {print NR, NF, "<" $0 ">\n"}' file
1 1 <Person Name
123 High Street
(222) 466-1234>

2 0 <>

3 1 <Another person
487 High Street
(523) 643-8754>
$ gawk --posix 'BEGIN{FS=","; RS="\n\n"} {print NR, NF, "<" $0 ">\n"}' file
1 1 <Person Name>

2 1 <123 High Street>

3 1 <(222) 466-1234>

4 0 <>

5 0 <>

6 0 <>

7 1 <Another person>

8 1 <487 High Street>

9 1 <(523) 643-8754>

10 0 <>