Сделать статистику биграмм [закрыто]

Нужно что-то вроде "насрать на вечную историю".
Здесь есть хорошее описание, чтобы заставить его работать.

В этом решении по-прежнему отсутствует PID, который можно было бы добавить с помощью идей отсюда.

В основном:

export HISTTIMEFORMAT="%s "
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND ; }"' \
               echo $$ $USER "$(history 1)" >> ~/.bash_eternal_history'

Который использует $PROMPT_COMMANDдля генерации:

$PID $USER $LAST_COMMAND

вывода для каждой выполненной команды.

1
10.03.2017, 18:54
3 ответа

paste -d '' - -

Чтобы получить количество произведенных биграмм:

paste -d '' - -

Однако этот метод исключает половину биграмм. Например, если ваш входной файл:

alpha
beta
gamma
alpha
beta
gamma

Биграммы будут включать строки 1-2, строки 3-4 и строки 5-6, но не строки 2-3 и 3-4.

Один из возможных способов решения этой проблемы - создать копию входного файла и добавить не-слово в начало (например, '#'), а затем отфильтровать результат, содержащий не-слово:

cat <(paste -d '' - -

0
28.01.2020, 01:00

В системах 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
0
28.01.2020, 01:00

Если вы хотите объединить слова в каждых двух последовательных строках, чтобы получить биграмму, вы можете сделать это следующим образом:

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

0
28.01.2020, 01:00

Теги

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