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

her*_*ant 2 unix linux awk

以下是该文件的内容:

Person Name
123 High Street
(222) 466-1234

Another person
487 High Street
(523) 643-8754

Run Code Online (Sandbox Code Playgroud)

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

$ awk 'BEGIN{FS="\n"; RS="\n\n"} {print $1, $3}' file_contents
Run Code Online (Sandbox Code Playgroud)
$ awk 'BEGIN{FS="\n"; RS=""} {print $1, $3}' file_contents
Run Code Online (Sandbox Code Playgroud)

两种情况给出的结果是:

Person Name (222) 466-1234
Another person (523) 643-8754
Run Code Online (Sandbox Code Playgroud)

RS="\n\n"其实很有道理,但是为什么RS=""也受到同样的待遇呢?

Ed *_*ton 5

他们没有受到同样的待遇。

  • RS=""在所有 awks中调用段落模式,因此输入被分成由连续的空行序列分隔的记录,并且如果现有 FS 是单个字符,则将换行符添加到 FS(注意:POSIX 标准在这方面不正确,因为它暗示\n将被添加到任何FS但事实并非如此,请参阅https://lists.gnu.org/archive/html/bug-gawk/2019-04/msg00029.html)。
  • RS="\n\n"在GNU awk中工作,将记录分隔符设置为单个空行,并且不影响 FS。在所有其他 awks 中,第二个\n将被忽略(RS 中超过 1 个字符是每个 POSIX 未定义的行为,因此它们可以执行任何操作,但这是迄今为止最常见的实现)。

看看当 2 个文本块之间有 3 个空行并使用除\n(eg ,) 之外的 FS 时会发生什么:

$ cat file
Person Name
123 High Street
(222) 466-1234



Another person
487 High Street
(523) 643-8754
Run Code Online (Sandbox Code Playgroud)

$ 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>
Run Code Online (Sandbox Code Playgroud)

$ 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>
Run Code Online (Sandbox Code Playgroud)

$ 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>
Run Code Online (Sandbox Code Playgroud)

$ 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 <>
Run Code Online (Sandbox Code Playgroud)

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