为什么'awk1rs=,

为什么'awk1rs=,,awk,gawk,Awk,Gawk,我问了一个问题,我使用了一个小awk技巧将逗号转换成新行: awk 1 RS=, file 然而,我随后注意到,这在输出的末尾引入了一个额外的新行: $ cat a 1,2 $ awk 1 RS=, a 1 2 # one extra line $ awk 1 RS=, <<< "1,2" 1 2 # one extra line 是的,显然分割完成了,但由于某种原因,第二条记录包含在2中,后面跟着一条新行。是的,awk只

我问了一个问题,我使用了一个小awk技巧将逗号转换成新行:

awk 1 RS=, file
然而,我随后注意到,这在输出的末尾引入了一个额外的新行:

$ cat a
1,2
$ awk 1 RS=, a
1
2
             # one extra line
$ awk 1 RS=, <<< "1,2"
1
2
             # one extra line
是的,显然分割完成了,但由于某种原因,第二条记录包含在2中,后面跟着一条新行。是的,awk只看到两条记录:

$ awk '{print NR}' RS=, <<< "1,2"
1
2
好的,我说:那么这只是新行中的一个问题,它被附加到字符串的末尾

但是。。。我发现情况并非总是如此,我的困惑越来越大:

$ awk '{print $0, "hey"}' <<< "1,2"
1,2 hey         # no more lines after this

所以我的问题是:RS=,做了什么使这个额外的新行被追加?

它是输入流中的新行

$ awk 1 RS=, < <(echo -n 1,2)

1
2
比较

$ echo 1,2 | awk 1 RS=,
1
2

$ echo 1,2 | tr ',' '\n'
1
2

它是输入流中的换行符

$ awk 1 RS=, < <(echo -n 1,2)

1
2
比较

$ echo 1,2 | awk 1 RS=,
1
2

$ echo 1,2 | tr ',' '\n'
1
2

Awk处理每条记录,自动从末尾删除记录分隔符。如果您将其更改为新行以外的内容,这意味着它不会被删除,因此您最终会出现这种行为

您的记录计数是2,尽管您只有一个,但在本例中也是2,希望不会让这更令人困惑!:

$ printf 'a\nb' | awk '{print NR}'
1
2

Awk处理每条记录,自动从末尾删除记录分隔符。如果您将其更改为新行以外的内容,这意味着它不会被删除,因此您最终会出现这种行为

您的记录计数是2,尽管您只有一个,但在本例中也是2,希望不会让这更令人困惑!:

$ printf 'a\nb' | awk '{print NR}'
1
2

不是awk在添加新行,不是awk在添加新行,而是为什么使用RS=,而不是默认值时会发生这种情况?当您将RS设置为逗号时,最后一个新行将保留在记录中。在EOF之前,输入文件中是否需要最后一个换行符是一个更大的争论。非常好的观点,现在我明白了。事实上,这让我想起了一个我自己不久前问过的问题:但是为什么在使用RS=时会发生这种情况,而不是当它是默认值时?当您将RS设置为逗号时,它会将最后一个换行保留为记录的一部分。在EOF之前,输入文件中是否需要最后一个换行符是一个更大的争论。非常好的观点,现在我明白了。事实上,这就是我刚才问的一个问题:你把记录分隔符和字段分隔符混淆了吗?@NeilMcGuigan no.你把记录分隔符和字段分隔符混淆了吗?@NeilMcGuigan no.OOOOK所以这里的关键是删除RS:当它不是新行时,1,2\n被视为这样,所以awk认为第一条记录是1,第二条记录是2。OOOK所以这里的关键是删除RS:当它不是新行时,1,2\n被视为1,所以awk认为第一条记录是1,第二条记录是2\n。
awk 1 RS=, <<< "1,2"