Пример 12-8. Частота встречаемости отдельных слов
#!/bin/bash
# wf.sh: "Сырой" анализ частоты встречаемости слова в текстовом файле.
ARGS=1
E_BADARGS=65
E_NOFILE=66
if [ $# -ne "$ARGS" ] # Файл для анализа задан?
then
echo "Порядок использования: `basename $0` filename"
exit $E_BADARGS
fi
if [ ! -f "$1" ] # Проверка существования файла.
then
echo "Файл \"$1\" не найден."
exit $E_NOFILE
fi
########################################################
# main ()
sed -e 's/\.//g' -e 's/ /\
/g' "$1" | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr
# =========================
# Подсчет количества вхождений
# Точки и пробелы заменяются
#+ символами перевода строки,
#+ затем символы переводятся в нижний регистр
#+ и наконец подсчитывается количество вхождений,
#+ и выполняется сортировка по числу вхождений.
########################################################
# Упражнения:
# ---------
# 1) Добавьте команду 'sed' для отсечения других знаков пунктуации, например, запятых.
# 2) Добавьте удаление лишних пробелов и других пробельных символов.
# 3) Добавьте дополнительную сортировку так, чтобы слова с одинаковой частотой встречаемости
#+ сортировались бы в алфавитном порядке.
exit 0
bash$ cat testfile
Эта строка встречается только один раз.
Эта строка встречается дважды.
Эта строка встречается дважды.
Эта строка встречается трижды.
Эта строка встречается трижды.
Эта строка встречается трижды.
bash$ ./wf.sh testfile
6 Эта
6 встречается
6 строка
3 трижды
2 дважды
1 только
1 один
1 раз
expand, unexpand
Команда expandпреобразует символы табуляции в пробелы. Часто используется в конвейерной обработке текста.
Команда unexpandпреобразует пробелы в символы табуляции. Т.е. она является обратной по отношению к команде expand.
cut
Предназначена для извлечения отдельных полей из текстовых файлов. Напоминает команду print $Nв awk, но более ограничена в своих возможностях. В простейших случаях может быть неплохой заменой awkв сценариях. Особую значимость, для команды cut, представляют ключи -d (разделитель полей) и -f (номер(а) поля(ей)).
Использование команды cutдля получения списка смонтированных файловых систем:
cat /etc/mtab | cut -d ' ' -f1,2
Использование команды cutдля получения версии ОС и ядра:
uname -a | cut -d" " -f1,3,11,12
Использование команды cutдля извлечения заголовков сообщений из электронных писем:
bash$ grep '^Subject:' read-messages | cut -c10-80
Re: Linux suitable for mission-critical apps?
MAKE MILLIONS WORKING AT HOME3
Spam complaint
Re: Spam complaint
Использование команды cutпри разборе текстового файла:
# Список пользователей в /etc/passwd.
FILENAME=/etc/passwd
for user in $(cut -d: -f1 $FILENAME)
do
echo $user
done
# Спсибо Oleg Philon за этот пример.
cut -d ' ' -f2,3 filenameэквивалентно awk -F'[ ]' '{ print $2, $3 }' filename
См. также Пример 12-33.
paste
Используется для объединения нескольких файлов в один многоколоночный файл.
join
Может рассматриваться как команда, родственная команде paste. Эта мощная утилита позволяет объединять два файла по общему полю, что представляет собой упрощенную версию реляционной базы данных.
Команда joinоперирует только двумя файлами и объедияет только те строки, которые имеют общее поле (обычно числовое), результат объединения выводится на stdout . Объединяемые файлы должны быть отсортированы по ключевому полю.
File: 1.data
100 Shoes
200 Laces
300 Socks
File: 2.data
100 $40.00
200 $1.00
300 $2.00
bash$ join 1.data 2.data
File: 1.data 2.data
100 Shoes $40.00
200 Laces $1.00
300 Socks $2.00
На выходе ключевое поле встречается только один раз.
head
Выводит начальные строки из файла на stdout (по-умолчанию -- 10 строк, но это число можно задать иным). Эта команда имеет ряд интересных ключей.
Пример 12-9. Какие из файлов являются сценариями?
#!/bin/bash
# script-detector.sh: Отыскивает файлы сценариев в каталоге.
TESTCHARS=2 # Проверяются первые два символа.
SHABANG='#!' # Сценарии как правило начинаются с "sha-bang."
Читать дальше