带有regex过滤器的awk输出似乎跳过了索引



我在一个文件中有这样一行:

abc-content: ["afox","dfox","xfox","ufox","sdao","qusa","hero"]

在玩了awk之后,这似乎可以很好地从线路中拉出所有的字符串:

awk -F'[ :[,"]' '{print $1, $5, $8, $11, $14, $17, $20, $23}' < file

如果我使用$2、$3或$4而不是$5(例如(,我会得到一个空白输出。有人能解释一下这里可能发生的事情吗?我的过滤器是否也占用了中间索引?

分隔符之间的空字符串,例如每个",之间的字符串,将是给定FS设置的字段。

ITYM-F': [[]"|","|"]'或类似产品:

$ awk -F': [[]"|","|"]' '{for (i=1; i<=NF; i++) print i, "<" $i ">"}' file
1 <abc-content>
2 <afox>
3 <dfox>
4 <xfox>
5 <ufox>
6 <sdao>
7 <qusa>
8 <hero>
9 <>

或者,如果您不希望在最后一个FS组件("](之后有空字段,则不要将其包含在FS中,只需从记录末尾删除"]

$ awk -F': [[]"|","' '{sub(/"]$/,""); for (i=1; i<=NF; i++) print i, "<" $i ">"}' file
1 <abc-content>
2 <afox>
3 <dfox>
4 <xfox>
5 <ufox>
6 <sdao>
7 <qusa>
8 <hero>

如果您愿意,-F'(: [[]|",)"'将是编写FS的另一种方式。

以下是您的FS设置如何将记录拆分为字段:

$ awk -F'[ :[,"]' '{for (i=1; i<=NF; i++) print i, "<" $i ">"}' file
1 <abc-content>
2 <>
3 <>
4 <>
5 <afox>
6 <>
7 <>
8 <dfox>
9 <>
10 <>
11 <xfox>
12 <>
13 <>
14 <ufox>
15 <>
16 <>
17 <sdao>
18 <>
19 <>
20 <qusa>
21 <>
22 <>
23 <hero>
24 <]>

顺便说一句,尝试转义[以将其包含在括号表达式中是不必要的,就像大多数字符[已经是括号表达式中的文字一样,对于那些不是(]^-(的字符,用转义它们是错误的做法,以符合POSIX,您需要将它们适当地定位在括号表达式,请参阅https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03_05.

如果您引用的字段中有一些[不太可能]的字符组合(例如,如果您有一个像"foo"",""foo: ["这样的字段(,上述操作仍然会失败,因为它可能存在与CSV格式相关的所有常见问题。请参阅What';使用awk高效解析CSV的最稳健方法是什么?如果这对你的真实数据来说是个问题的话。

相关内容

最新更新