Respostas:
Envie-o sort
(para colocar os itens adjacentes juntos) e depois uniq -c
para fazer as contagens, ou seja:
sort filename | uniq -c
e para obter essa lista em ordem (por frequência), você pode
sort filename | uniq -c | sort -nr
Você pode viver com uma lista ordenada em ordem alfabética:
echo "red apple
> green apple
> green apple
> orange
> orange
> orange
> " | sort -u
?
green apple
orange
red apple
ou
sort -u FILE
-u significa único, e a exclusividade só é alcançada por meio da classificação.
Uma solução que preserva a ordem:
echo "red apple
green apple
green apple
orange
orange
orange
" | { old=""; while read line ; do if [[ $line != $old ]]; then echo $line; old=$line; fi ; done }
red apple
green apple
orange
e, com um arquivo
cat file | {
old=""
while read line
do
if [[ $line != $old ]]
then
echo $line
old=$line
fi
done }
Os dois últimos removem apenas duplicatas, que seguem imediatamente - o que se encaixa no seu exemplo.
echo "red apple
green apple
lila banana
green apple
" ...
Vai imprimir duas maçãs, divididas por uma banana.
Para obter apenas uma contagem:
$> egrep -o '\w+' fruits.txt | sort | uniq -c
3 apple
2 green
1 oragen
2 orange
1 red
Para obter uma contagem classificada:
$> egrep -o '\w+' fruits.txt | sort | uniq -c | sort -nk1
1 oragen
1 red
2 green
2 orange
3 apple
EDITAR
Aha, isso NÃO foi ao longo dos limites das palavras, meu mal. Este é o comando a ser usado para linhas completas:
$> cat fruits.txt | sort | uniq -c | sort -nk1
1 oragen
1 red apple
2 green apple
2 orange
Aqui está um script python simples usando o tipo Counter . A vantagem é que isso não exige a classificação do arquivo, basicamente usando memória zero:
import collections
import fileinput
import json
print(json.dumps(collections.Counter(map(str.strip, fileinput.input())), indent=2))
Resultado:
$ cat filename | python3 script.py
{
"red apple": 1,
"green apple": 2,
"orange": 3
}
ou você pode usar uma linha simples:
$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'
-d
nota.