Сценарий оболочки для поиска биграмм

Я делаю сценарий оболочки для поиска биграмм, который вроде как работает.

#tokenise words
tr -sc 'a-zA-z0-9.' '\012' < $1 > out1
#create 2nd list offset by 1 word
tail -n+2 out1 > out2
#paste list together
paste out1 out2 
#clean up
rm out1 out2

Единственная проблема заключается в том, что он объединяет слова из конца и начала предыдущего предложения.

например, для двух предложений «привет, мир». и "foo bar". я получу строку с «миром». foo '. Можно ли отфильтровать их с помощью grep или чего-то еще?

Я знаю, что могу найти все биграммы, содержащие точку с помощью grep [.], Но это также находит допустимые биграммы.

Вы также можете просмотреть "Unix for Poets" Кена Черча - классическое описание решений подобных проблем (pdf, оригинал)

user2314737 08.09.2020 22:03
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
2 475
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Просто замените строку вставки на это:

paste out1 out2 | grep -v '\..'

Это отфильтрует любые строки, содержащие точку, которая не является последним символом строки.

Выражение grep соответствует (а опция -v исключает) всему, что соответствует точке, за которой следует то, что не является знаком доллара. Поскольку вывод tr не включает доллары, он работает, но не очевидно, что класс символов был необходим. Это могло быть просто "\ ..".

Jonathan Leffler 29.10.2008 02:31

В сценариях оболочки можно использовать каналы.

cat "$@" |
tr -cs "a-zA-Z0-9." '\012' |
{
old = "aaa."
while read new
do
    case "$old" in
    *.) : OK;;
    *)  echo "$old $new";;
    esac
    old = "$new"
done
}

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

 echo "$old ${new%.}"

Версия без украшений (с отображенными точками) работает как с оболочкой Bourne, так и с ее производными; версия с ${new%.} работает только с оболочкой Korn и производными, а не с исходной оболочкой Bourne.

Если вам необходимо использовать временные файлы, укажите в их именах идентификатор процесса ($$) и удалите их с помощью ловушки:

tmp=${TMPDIR:-/tmp}/bigram.$$
trap 'rm -f $tmp.?; exit 1' 0 1 2 3 13 15

...code using $tmp.1, $tmp.2, etc...

rm -f $tmp.?
trap 0

Сигнал 1 - это зависание (HUP), 2 - прерывание (INT), 3 - выход (QUIT), 13 - канал (PIPE) и 15 - завершение (TERM); 0 - это «любой выход» и в этом контексте почти нездоровый. Перед фактическим выходом не забудьте отменить ловушку выхода, как показано.

Другие вопросы по теме