1

我的 awk 程序做了一些奇怪的字符匹配。您能否解释一下发生了什么或将我指向相关文档。

输入文件

| 29900 | St. James | ...
| 33010 | Boole / Kirk | ...

awk

awk '/\| ([0-9]{5}) \| ([^\|]*)/{print $2 $4}' input-file.txt

结果

29900St.
33010Boole
  • 为什么第一个捕获组 $1 领先|?通常 $0 是整场比赛,$1 是第一组。
  • 为什么([^\|]*)停在./不是继续阅读?我基本上告诉它“所有不是|的字符” 毕竟。
4

2 回答 2

3

默认情况下,awk 用空格分隔列,所以对于记录

| 29900 | St. James | ...

我们有 $1="|", $2="29900", $3="|", $4="St.", $5="James", $6="|" 和 $7="..."

此外,与 Perl 不同,awk 不会将捕获括号的内容存储在任何地方(但gawk 会

看到您想使用管道作为分隔符,我建议:

awk -F '[[:blank:]]*\\|[[:blank:]]*' -v OFS=, '$2 ~ /[0-9]{5}/ {print $2,$3}'
29900,St. James
33010,Boole / Kirk

如果您对在其中看到 $2 和 $3 而不是 $1 和 $2 感到困惑,请考虑字段分隔符,根据定义,分隔两个字段并且必须在其前后有一个字段。第一个字段分隔符出现在每行的开头,因此在它之前必须有一个由空字符串组成的字段:$1 将是空字符串。

于 2013-09-20T22:57:10.430 回答
2

awk不提供访问捕获组的方法,它用于$<number>访问输入文件的字段。看起来你可以这样做:

awk -F' *\| *' '{print $2 $3;}' input-file.txt
于 2013-09-20T22:57:17.643 回答