Linux shell скрипт для подсчета появления последовательности символов в текстовом файле? - PullRequest
1 голос
/ 31 октября 2009

У меня большой текстовый файл (более 70 МБ), и мне нужно подсчитать, сколько раз последовательность символов встречается в файле. Я могу найти множество сценариев для этого, но никто из них не принимает во внимание, что последовательность может начинаться и заканчиваться в разных строках. Ради эффективности (на самом деле у меня есть более 1 файла, который я обрабатываю), я не могу предварительно обработать файлы, чтобы удалить переводы строки.

Пример: Если я ищу "thisIsTheSequence", следующий файл будет иметь 3 совпадения:

asdasdthisIsTheSequence
asdasdasthisIsT
heSequenceasdasdthisIsTheSequ
encesadasdasda

Спасибо за помощь.

Ответы [ 4 ]

7 голосов
/ 31 октября 2009

Один вариант:

echo $((`tr -d "\n" < file | sed 's/thisIsTheSequence/\n/g' | wc -l` - 1))

Возможно, существуют более эффективные методы, использующие утилиты вне ядра оболочки, особенно если вы можете поместить файл в память.

2 голосов
/ 31 октября 2009

Подойдет только один сценарий awk, так как вы будете обрабатывать огромный файл. Выполнение нескольких каналов может замедлить процесс.

#!/bin/bash
awk 'BEGIN{
 search="thisIsTheSequence"
 total=0
}
NR%10==0{
  c=gsub(search,"",s)
  total+=c  
}
NR{ s=s $0 }
END{ 
 c=gsub(search,"",s)
 print "total count: "total+c
}' file

выход

$ more file
asdasdthisIsTheSequence
asdasdasthisIsT
heSequenceasdasdthisIsTheSequ
encesadasdasdaasdasdthisIsTheSequence
asdasdasthisIsT
heSequenceasdasdthisIsTheSequ
encesadasdasda
asdasdthisIsTheSequence
asdasdasthisIsT
heSequenceasdasdthisIsTheSequ
encesadasdasda

$ ./shell.sh
total count: 9
0 голосов
/ 31 октября 2009

Будет ли когда-нибудь в вашей последовательности более одной строки?

Если нет, то одним из решений было бы разделить вашу последовательность пополам и выполнить поиск половин (например, поиск «thisIsTh», а также «eSequence»), а затем вернитесь к найденным вхождениям и посмотрите «ближе» ", то есть зачеркнуть строки в этой области и проверить на совпадение.

По сути, это своего рода быстрая «фильтрация» данных, чтобы найти что-то интересное.

0 голосов
/ 31 октября 2009

используйте что-то вроде:

head -n LL filename | tail -n YY | grep text | wc -l

где LL - последняя строка последовательности, а YY - количество строк в последовательности (т. Е. LL - первая строка)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...