2009-09-21 4 views
2

У меня есть текстовый файл, как это:Как написать сценарий оболочки, который фильтрует строки и подсчитывает их?

Apple 
Orange 
Orange 
Banana 
Banana 
Orange 
Banana 
Orange 
Apple 
Orange 

Я хочу, чтобы произвести следующий вывод после запуска скрипта оболочки Bash:

Apple: 2 
Orange: 5 
Banana: 3 

Это довольно стандартный материал, если я использую полномасштабный язык как Java/C++ и т. Д., Но каков самый быстрый способ сделать это с помощью сценария оболочки/командной строки?

+0

домашнее задание, а? –

+0

@ Dennis: Или объединить тонну интернет-фантастики (с информацией о местоположении автора) со списком фруктов, чтобы сделать исследование по распространенности фруктов по сравнению с регионом! Вам не интересно? – Cascabel

ответ

13
sort $FILE | uniq -c 

даст вам

2 Apple 
3 Banana 
5 Orange 
+1

, и для переформатирования вы можете использовать perl, как сказал NawaMan, или sed: '... | sed -r 's/* ([0-9]) + * (. *)/\ 2: \ 1 /' '(' -r' переключает его на расширенное регулярное выражение, а подстановка такая же, как у NawaMan без ненужные скобки). – Cascabel

+0

согласны с этим как лучше, потому что похоже, что пользователь гибкий в выходном формате. Требования часто согласовываются после начала диалога. – ericslaw

4

Сортировка filename | uniq -c | AWK '{печать $ 2 ":" $ 1}'

+0

Не нужно кошке! – Cascabel

+0

согласился, не нужно коту – rangalo

+0

Дополнительный awk будет отформатировать его по мере необходимости – rangalo

2
uniq -c $FILE | perl -pe 's|[ ]*([0-9]+)[ ]*(.*)|\2: \1|'

Это форматировать его пути указано. Вы можете добавить '| sort 'в конце сортировки тоже.

EDIT: Как указано в комментарии, я делаю ошибку в uniq, так что это исправленный.

sort $FILE | uniq -c | perl -pe 's|[ ]*([0-9]+)[ ]*(.*)|\2: \1|'

Извините, проблема.

+0

'uniq' проверяет последовательные идентичные строки. Сначала вы должны отсортировать список. – Cascabel

+0

Спасибо, что указали это. Я в основном использовал уже отсортированные данные, поэтому я забыл об этом. – NawaMan

4

Это решение использует только один инструмент: AWK

$ awk '{count[$0]++} END {for (c in count) {print c ": " count[c]}} ' count.txt 
Orange: 5 
Banana: 3 
Apple: 2 
Смежные вопросы