为什么';t awk似乎致力于根据“涉及”的备选方案将字段拆分为多个字段&引用;?

为什么';t awk似乎致力于根据“涉及”的备选方案将字段拆分为多个字段&引用;?,awk,Awk,可以在上进行awk拆分: >printf foo.bar | awk '{split($0, a, "."); print a[1]}' foo >printf foo.bar | awk '{split($0, a, ".|a"); print a[1]}' 可以在替代方案上进行awk拆分: >printf foo.bar | awk '{split($0, a, "b|a"); print a[1]}' foo. 那么,为什么在涉及的先行项上拆分不合适: >pr

可以在
上进行awk拆分:

>printf foo.bar | awk '{split($0, a, "."); print a[1]}'
foo
>printf foo.bar | awk '{split($0, a, ".|a"); print a[1]}'
可以在替代方案上进行awk拆分:

>printf foo.bar | awk '{split($0, a, "b|a"); print a[1]}'
foo.
那么,为什么在涉及
的先行项上拆分不合适:

>printf foo.bar | awk '{split($0, a, "."); print a[1]}'
foo
>printf foo.bar | awk '{split($0, a, ".|a"); print a[1]}'

(没有印刷)

逃离那个时期,我想你会成为黄金:

 printf foo.bar | awk '{split($0, a, "\\.|a"); print a[1]}'

JNevill展示了如何让它工作。但要回答您的问题,即为什么在一种情况下需要转义,而在另一种情况下不需要转义,我们可以在awk手册中的“如何根据FS的值拆分字段”摘要中找到答案。(同样的规则适用于
split
命令的fieldsep。)

底线是,当FS是单个字符时,它不会被视为正则表达式,反之亦然

因此,
split($0,a,“.”)正如我们所希望的那样工作,将
从字面上理解为
,但是
split($0,a,“.a”)
a
作为regexp,其中
具有特殊含义,将分隔符设置为任何字符,因此,有必要添加反斜杠,让
按字面意思处理

FS==”
字段之间用空格分隔。忽略前导空格和尾随空格。这是默认设置

FS==任何单个字符 字段由字符的每个匹配项分隔。多个连续出现会分隔空字段,前导字段和前导字段也是如此 尾随事件

FS==regexp
字段由匹配regexp的字符分隔。regexp的前导匹配项和尾随匹配项分隔空字段

您可以看到,尽管结果是空的,
,但a
确实在做一些事情,将该行划分为八个空字段——就像
,,,,,
这样的行将
FS
设置为

$ printf foo.bar | awk '{split($0, a, ".|a"); for (i in a) print i ": " a[i]; }'
4: 
5: 
6: 
7: 
8: 
1: 
2: 
3: 

正确-但是为什么以前甚至不需要一次逃跑,而不需要改变呢?