【发布时间】:2014-08-30 08:37:59
【问题描述】:
我不是 Linux 专家,但查看各种论坛中的不同帖子,我一直在尝试编写一个脚本来匹配文件中同时出现的字符模式。 我的文件有大约 2 亿个字符(大写和小写),每行大约 50 个字符。我已将所有行合并在一起,使用
使其成为一行tr -d '\n' < input.txt > oneLineInput.txt
这会将我文件中的所有字符放到同一行,没有空格。
我正在尝试计算特定字符一起出现的次数。例如,在下面的文件中
IamTryingtobuildascriptfortrestingthetyposinmysentence
我正在尝试寻找句子中出现的模式“tr”。我现在的脚本是
grep -o -i oneLineInput.txt -e tr | sort | uniq -c
上面的脚本对于一个小文件来说工作得很好,但是当我尝试在超过 2 亿个字符的实际文件上运行它时,完成任务需要很长时间(我失去了耐心,没有检查总时间采取)。
- 有什么方法可以优化代码吗?
我也一直在尝试获得比赛的位置。例如,在上面的示例文件中,“tr”从第 4 位和第 27 位开始。
- 是否可以在输出中以数字形式获取索引的位置。
谢谢
【问题讨论】:
-
我可以使用上述脚本计算原始文件中“tr”的出现次数。但是,当 't' 出现在一行的最后一个位置并且 'r' 是下一行的第一个字符时,我错过了一些计数。
-
通过删除换行符,您创建的情况是,
t位于一行的末尾,r位于另一行的开头,现在将被视为tr的出现。那是你要的吗?如果t和r之间还有其他空格字符怎么办——那么它们应该算作tr吗?无论哪种方式,合并行都不是一个有用的步骤,如果这是所需的行为,则简单地忽略空格同样容易。 -
我拥有的文件没有空间。所讨论的模式也可以在两条连续的线上找到。因此,我合并了这些行。 @ Ed Morton,我如何忽略空格???有什么建议吗?
-
使用
-F'[Tt][[:space:]]*[Rr]'作为匹配的FS,-v RS='^$'作为GNU awk的记录分隔符(其他awk有其他方式)。[[:space:]]*表示零个或多个空格字符,并且 RS 设置告诉 gawk 将整个文件视为单个字符串。 -
哇……太棒了。完美无瑕。现在轮到我了解基础知识了:)
标签: shell awk grep pattern-matching