Как написать сценарий оболочки, который фильтрует строки и считает их? - PullRequest
2 голосов
/ 22 сентября 2009

У меня есть такой текстовый файл:

Apple
Orange
Orange
Banana
Banana
Orange
Banana
Orange
Apple
Orange

Я хочу получить следующий вывод после запуска сценария оболочки bash:

Apple: 2
Orange: 5
Banana: 3

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

Ответы [ 4 ]

13 голосов
/ 22 сентября 2009
sort $FILE | uniq -c

даст вам

2 Apple
3 Banana
5 Orange
4 голосов
/ 22 сентября 2009

В этом решении используется только один инструмент: awk

$ awk '{count[$0]++} END {for (c in count) {print c ": " count[c]}} ' count.txt
Orange: 5
Banana: 3
Apple: 2
4 голосов
/ 22 сентября 2009

сортировать имя файла | uniq -c | awk '{print $ 2 ":" $ 1}'

2 голосов
/ 22 сентября 2009
uniq -c $FILE | perl -pe 's|[ ]*([0-9]+)[ ]*(.*)|\2: \1|'

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

РЕДАКТИРОВАТЬ: Как указано в комментарии, я делаю ошибку в отношении Uniq, поэтому здесь исправлено.

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

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

...