在文件中搜索,计数和计数的位置

时间:2014-08-30 08:37:59

标签: shell awk grep pattern-matching

我不是Linux的专家,但是在不同的论坛中查看不同的帖子,我一直在尝试编写一个脚本来匹配文件中出现的字符模式。 我的文件大约有2亿个字符(大写和小写),每行约50个字符。我已将所有行合并在一起,使用

创建一行
tr -d '\n' < input.txt > oneLineInput.txt

这会将我文件中的所有字符都放到没有空格的同一行。

我正在尝试计算特定字符一起出现的次数。例如,在下面的文件中

IamTryingtobuildascriptfortrestingthetyposinmysentence

我试图寻找句子中出现的'tr'模式。我现在的脚本是

grep -o -i oneLineInput.txt -e tr | sort | uniq -c

上面的脚本对于一个小文件非常适用,但是当我尝试在我的实际文件上运行它超过2亿个字符时,完成任务需要很长时间(我失去了耐心并且没有检查总时间拍摄)。

  1. 有没有办法可以优化代码?
  2. 我也一直试图获得比赛的位置。例如,在上面的示例文件中,'tr'从第4和第27位开始。

    1. 是否可以将索引的位置作为输出中的数字。
    2. 谢谢

2 个答案:

答案 0 :(得分:1)

awk将显示tr

中您有多少oneLineInput.txt
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个字符的多个数据长度。

答案 1 :(得分:0)

以下是使用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