это работает для 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)'
Подход 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 различных слов.
Это не приведет к сбою системы, но может занять много времени, так как входные данные анализируются несколько раз. Предполагая, что входной файл называется "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
Мне непонятно, должны ли частичные совпадения быть привязаны к началу строки. Если предположить, что ответ «да», может ускорить процесс, так это использование бинарного поиска с помощью почтенной команды 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
для принудительного бинарного поиска. Кэширование отсортированного файла на диске может еще больше ускорить процесс
Вот один из способов, но он не очень изящный:
$ 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