gpt4 book ai didi

linux - 在 awk 中,为什么 ""和 "\n\n"对于 RS 参数的处理方式相同?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:57 25 4
gpt4 key购买 nike

文件内容如下:

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
$ awk 'BEGIN{FS="\n"; RS=""} {print $1, $3}' file_contents

两种情况给出的结果都是:

Person Name (222) 466-1234
Another person (523) 643-8754

RS="\n\n"其实是有道理的,但是为什么RS=""也被这样对待呢?

最佳答案

他们的待遇不同。

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

看看当您的 2 个文本 block 之间有 3 个空行并使用 \n 以外的 FS(例如 ,)时会发生什么:

$ 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 <>

注意 NRNF 的不同值以及打印的不同 $0 内容。

关于linux - 在 awk 中,为什么 ""和 "\n\n"对于 RS 参数的处理方式相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57851531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com