以下是该文件的内容:
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=""也受到同样的待遇呢?
他们没有受到同样的待遇。
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打印的不同内容。