为什么';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:
正确-但是为什么以前甚至不需要一次逃跑,而不需要改变呢?