【问题标题】:Search, count and position of the count in a file文件中计数的搜索、计数和位置
【发布时间】: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 亿个字符的实际文件上运行它时,完成任务需要很长时间(我失去了耐心,没有检查总时间采取)。

  1. 有什么方法可以优化代码吗?

我也一直在尝试获得比赛的位置。例如,在上面的示例文件中,“tr”从第 4 位和第 27 位开始。

  1. 是否可以在输出中以数字形式获取索引的位置。

谢谢

【问题讨论】:

  • 我可以使用上述脚本计算原始文件中“tr”的出现次数。但是,当 't' 出现在一行的最后一个位置并且 'r' 是下一行的第一个字符时,我错过了一些计数。
  • 通过删除换行符,您创建的情况是,t 位于一行的末尾,r 位于另一行的开头,现在将被视为 tr 的出现。那是你要的吗?如果tr 之间还有其他空格字符怎么办——那么它们应该算作tr 吗?无论哪种方式,合并行都不是一个有用的步骤,如果这是所需的行为,则简单地忽略空格同样容易。
  • 我拥有的文件没有空间。所讨论的模式也可以在两条连续的线上找到。因此,我合并了这些行。 @ Ed Morton,我如何忽略空格???有什么建议吗?
  • 使用-F'[Tt][[:space:]]*[Rr]'作为匹配的FS,-v RS='^$'作为GNU awk的记录分隔符(其他awk有其他方式)。 [[:space:]]* 表示零个或多个空格字符,并且 RS 设置告诉 gawk 将整个文件视为单个字符串。
  • 哇……太棒了。完美无瑕。现在轮到我了解基础知识了:)

标签: shell awk grep pattern-matching


【解决方案1】:

awk 将显示您在oneLineInput.txt 中有多少tr

awk -F"[Tt][Rr]" '{print NF-1}' oneLineInput.txt
2

获取位置:

awk -F"[Tt][Rr]" 'BEGIN {print "hit\tposition"} {for (i=1;i<NF;i++) {p+=length($i);print ++a"\t"p+1+(a-1)*2}}' oneLineInput.txt
hit     position
1       4
2       27

获取位置:p+1+(a-1)*2
p 增加字段长度
+1 因为tr 位于字段长度之后。
(a-1)*2 命中数 -1要搜索的多个数据长度 tr = 2 个字符。

【讨论】:

  • 这太不可思议了。我不知道该怎么感谢你才足够。我必须破译并了解它是如何工作的。我曾经为我拥有的文件大小花费很长时间的脚本。不幸的是,由于我的声誉,我无法投票。非常感谢:)
  • @biowizz 欢迎您。学习所有不错的技巧和窍门需要花费大量时间。
【解决方案2】:

这是另一种使用 awk 的方法:

{ 
    while (match($0, /[Tt][Rr]/)) {
        ++n
        m += RSTART
        $0 = substr($0, RSTART + RLENGTH)
        printf "match %d: position %d\n", n, m + n - 1
    }
}

match将第一个匹配的位置存储在变量RSTART中,匹配的长度存储在RLENGTH中。 n 记录匹配的数量。 substr 用于从字符串的开头删除匹配项。要打印的位置必须偏移n - 1

输出:

$ awk -f matches.awk file
match 1: position 4
match 2: position 27

【讨论】:

  • 谢谢。这也很好用。但是比上一个答案稍慢。很高兴知道完成相同任务的不同方法。
猜你喜欢
  • 1970-01-01
  • 2015-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多