В сценариях оболочки могут использоваться каналы.
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 читает новое слово. Когда старое заканчивается точкой (как это происходит в начале), оно не формирует действительный биграмм по вашим правилам. Если вы хотите удалить точки из биграмм с окончанием предложения, вы можете использовать:
echo "$old ${new%.}"
Неукрашенная версия (с отображаемыми точками) работает как с оболочкой Bourne, так и с производными; версия с ${new%.}
только рабочими с оболочкой Korn и производными - не оригинальная оболочка Bourne.
Если вам необходимо использовать временные файлы, сделайте так, чтобы их имена содержали идентификатор процесса ($$) и используйте trap для их удаления:
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 - это «любой выход», и в этом контексте это почти что юджу. Перед фактическим выходом не забудьте отменить выходную ловушку, как показано на рисунке.