Подход 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 различных слов.
off_t
— это , определенный POSIX , и
Used for file sizes.
Он должен иметь возможность представлять отрицательные значения, поскольку он используется не только для размеров файлов, но и для смещений файлов (, отсюда и название ), а смещения могут быть отрицательными (, чтобы вернуться назад. в файле сlseek
например ).
Вы можете задаться вопросом, почему вместо этого нельзя использовать size_t
; но он используется для измерения размеров объектов, в частности объектов C, а не размеров файлов.