частота слов из файла с частичным совпадением

это работает для Firefox 57+. Вам понадобится lz4 (через pip ). Заголовок файла собирается из длины b'mozLz40\0'. Используйте переменную среды для пути к файлу, если вы хотите использовать его в однострочнике, замените на \nи \tсоответственно и объедините строки.

export opentabs=$(find ~/.mozilla/firefox*/*.default/sessionstore-backups/recovery.jsonlz4);

python3 <<< $'import os, json, lz4.block
f = open(os.environ["opentabs"], "rb")
magic = f.read(8)
jdata = json.loads(lz4.block.decompress(f.read()).decode("utf-8"))
f.close()
for win in jdata["windows"]:
    for tab in win["tabs"]:
        i = int(tab["index"]) - 1
        urls = tab["entries"][i]["url"]
        print(urls)'
4
20.09.2019, 18:11
4 ответа

Подход awk:

awk '
  !x {c[$0]; next}
  {for (i in c) if (index($0, i)) c[i]++}
  END{for (i in c) print c[i]"\t"i}' file x=1 file | sort -k1rn

Которые на ваш ввод дают

3       and
2       to
1       america
1       england
1       jerry
1       tom
1       went

Мы обрабатываем ввод в два прохода. На первом проходе мы записываем список различных слов в качестве ключей хеш-таблицы c.

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

Список отдельных слов в файле сохраняется в памяти. Если это английские слова, это не должно быть проблемой, поскольку в английском языке меньше и 200 000 различных слов.

3
27.01.2020, 20:48

Это не приведет к сбою системы, но может занять много времени, так как входные данные анализируются несколько раз. Предполагая, что входной файл называется "in":

sort -u < in | while read w
do
    printf "%d\t%s\n" `grep -c "$w" in` "$w"
done

что по вашему мнению меня зацепило:

1       america
3       and
1       england
1       jerry
2       to
1       tom
1       went
2
27.01.2020, 20:48

Мне непонятно, должны ли частичные совпадения быть привязаны к началу строки. Если предположить, что ответ «да», может ускорить процесс, так это использование бинарного поиска с помощью почтенной команды look. Конечно, lookнужно, чтобы его входной файл был отсортирован. Поэтому сначала создайте отсортированную версию исходного файла

.
 sort file > file.sorted

Затем выполните цикл по исходному файлу, lookпросматривая по одному слову в отсортированном файле.

while read -r word; do 
    printf "%s %d\n" "$word" "$(look -b "$word" file.sorted | wc -l)"; 
done <file

В некоторых системах флаг -bне требуется передавать в lookдля принудительного бинарного поиска. Кэширование отсортированного файла на диске может еще больше ускорить процесс

.
1
27.01.2020, 20:48

Вот один из способов, но он не очень изящный:

$ sort -u file | while IFS= read -r word; do 
        printf '%s\t%s\n' "$word" "$(grep -cFe "$word" file)"; 
    done
america 1
and 3
england 1
jerry   1
to  2
tom 1
went    1
4
27.01.2020, 20:48

Теги

Похожие вопросы