我的awk程序做了一些奇怪的字符匹配。你能解释一下发生了什么,或者指出我的相关文件。
输入文件
| 29900 | St. James | ...
| 33010 | Boole / Kirk | ...
AWK
awk '/\| ([0-9]{5}) \| ([^\|]*)/{print $2 $4}' input-file.txt
结果
29900St.
33010Boole
|
?通常$ 0是整场比赛,$ 1是第一组。([^\|]*)
会停在.
和/
而不是继续阅读?我基本上告诉它“所有不是的字符”毕竟。答案 0 :(得分:3)
默认情况下,awk按空格分隔列,因此记录
| 29900 | St. James | ...
我们有$ 1 =“|”,$ 2 =“29900”,$ 3 =“|”,$ 4 =“圣。”,$ 5 =“詹姆斯”,$ 6 =“|”和$ 7 =“......”
此外,与Perl不同,awk不会将捕获括号的内容存储在任何地方(gawk does虽然)
看到你想使用管道作为分隔符,我建议:
awk -F '[[:blank:]]*\\|[[:blank:]]*' -v OFS=, '$2 ~ /[0-9]{5}/ {print $2,$3}'
29900,St. James
33010,Boole / Kirk
如果你对在那里看到2美元和3美元而不是1美元和2美元感到困惑,那么根据定义,考虑一个字段分隔符,它将两个字段分开,并且必须在它之前和之后有一个字段。第一个字段分隔符显示在每行的开头,因此必须有一个由空字符串组成的字段:$ 1将是空字符串。
答案 1 :(得分:2)
awk
没有提供访问捕获组的方法,它使用$<number>
来访问输入文件的字段。看起来你可以做到:
awk -F' *\| *' '{print $2 $3;}' input-file.txt