Нужно что-то вроде "насрать на вечную историю".
Здесь есть хорошее описание, чтобы заставить его работать.
В этом решении по-прежнему отсутствует PID, который можно было бы добавить с помощью идей отсюда.
В основном:
export HISTTIMEFORMAT="%s "
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND ; }"' \
echo $$ $USER "$(history 1)" >> ~/.bash_eternal_history'
Который использует $PROMPT_COMMAND
для генерации:
$PID $USER $LAST_COMMAND
вывода для каждой выполненной команды.
paste -d '' - -
Чтобы получить количество произведенных биграмм:
paste -d '' - -
Однако этот метод исключает половину биграмм. Например, если ваш входной файл:
alpha
beta
gamma
alpha
beta
gamma
Биграммы будут включать строки 1-2, строки 3-4 и строки 5-6, но не строки 2-3 и 3-4.
Один из возможных способов решения этой проблемы - создать копию входного файла и добавить не-слово в начало (например, '#'), а затем отфильтровать результат, содержащий не-слово:
cat <(paste -d '' - -
В системах GNU
вы можете запустить:
paste <(head -n -1 infile) <(tail -n +2 infile) | sort | uniq -c
Переносимость:
sed -e '1!{$!p' -e '}' infile | paste -d' ' - - | sort | uniq -c
или
awk 'NR>1{i=t" "$0; z[i]++};{t=$0}END{for (i in z){print z[i], i}}' infile
Если вы хотите объединить слова в каждых двух последовательных строках, чтобы получить биграмму, вы можете сделать это следующим образом:
cat TEXTEN1.txt|sed 'N; s/\n/ /'|sort|uniq -c
это объединит последовательные пары таких строк 1-2, 3-4, 5-6 и т. д.
Если вы хотите объединить каждую строку +1 (например, 1-2, 2-3, 3-4 ...), вы можно сделать это так
cat TEXTEN1.txt|sed -n ':a N;s/\n/ /p;s/\w* //;ta'|sort|uniq -c
или использовать (несколько более элегантную) комбинацию sed + paste
от @don_crissti