我不是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位开始。
谢谢
答案 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