awk - awk 打印的记录多于原始文件中的记录
问题描述
我已经编写了matches.awk 以从文本文件的每一行打印与我的正则表达式匹配的文本。
`{
line = $0
while (match(line, /([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))[[:space:]]?[0-9][A-Za-z]{2})/)>0) {
print substr(line, RSTART, RLENGTH)
line = substr(line, RSART + RLENGTH) }}`
然后我打电话给
awk -f matches.awk file.txt
它正在正确打印数据,但奇怪的是打印某些记录的频率远远高于它们在文本文件中出现的频率。
这条记录是 file.txt '20 Lilac Grove, Leeds LS5 3AG, Lilac Grove' 中的一行,它出现的次数 (212) 是 file.txt (53) 中的四倍。知道这是为什么吗?
解决方案
您的代码中有错字(RSART 而不是 RSTART)。
它应该是:
{
line = $0
while (match(line, /([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([A-Za-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9][A-Za-z]?))))[[:space:]]?[0-9][A-Za-z]{2})/)>0) {
print substr(line, RSTART, RLENGTH)
line = substr(line, RSTART + RLENGTH) }}
刚刚经过测试,似乎没问题(即:正则表达式将在您的线路上运行一次)。
无论如何,恐怕你不明白你的代码是如何工作的。请检查字符串函数 GAWK页面,看看 match() 和 substr() 实际做了什么以及它们返回什么。
推荐阅读
- swift - 在 IOS13 中使用 Swift 在后台获取位置
- ios - 在单独的 UICollection 类中使用未解析的标识符“UICollection”
- javascript - 检查对象的属性是否包含子字符串的安全方法
- windows - PostgreSQL:中文命令行消息(Windows 10)
- java - Tomcat服务器上的Spring应用程序CPU利用率高
- node.js - Jenkins 构建 Angular 项目无法读取未定义的属性“解决”
- windows - 在 regedit 中添加参数的命令
- office365 - Microsoft365 - 团队日历/来宾访问
- uwp - 如何获取系统的隐藏字幕字体大小?
- yocto - 一种设置凭据以打包提要的方法 [YOCTO]