Câu trả lời:
Bạn có thể sống với một danh sách theo thứ tự bảng chữ cái:
echo "red apple
> green apple
> green apple
> orange
> orange
> orange
> " | sort -u
?
green apple
orange
red apple
hoặc là
sort -u FILE
-u là viết tắt của độc nhất, và tính duy nhất chỉ đạt được thông qua phân loại.
Một giải pháp duy trì thứ tự:
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
và, với một tệp
cat file | {
old=""
while read line
do
if [[ $line != $old ]]
then
echo $line
old=$line
fi
done }
Hai cách cuối cùng chỉ xóa các bản sao, sẽ theo sau ngay lập tức - phù hợp với ví dụ của bạn.
echo "red apple
green apple
lila banana
green apple
" ...
Sẽ in hai quả táo, tách bởi một quả chuối.
Để chỉ cần đếm:
$> egrep -o '\w+' fruits.txt | sort | uniq -c
3 apple
2 green
1 oragen
2 orange
1 red
Để có được số lượng được sắp xếp:
$> egrep -o '\w+' fruits.txt | sort | uniq -c | sort -nk1
1 oragen
1 red
2 green
2 orange
3 apple
BIÊN TẬP
Aha, điều này KHÔNG dọc theo ranh giới từ ngữ, tệ của tôi. Đây là lệnh để sử dụng cho các dòng đầy đủ:
$> cat fruits.txt | sort | uniq -c | sort -nk1
1 oragen
1 red apple
2 green apple
2 orange
Đây là một tập lệnh python đơn giản sử dụng loại Bộ đếm . Lợi ích là điều này không yêu cầu phân loại tệp, về cơ bản sử dụng bộ nhớ bằng không:
import collections
import fileinput
import json
print(json.dumps(collections.Counter(map(str.strip, fileinput.input())), indent=2))
Đầu ra:
$ cat filename | python3 script.py
{
"red apple": 1,
"green apple": 2,
"orange": 3
}
hoặc bạn có thể sử dụng một lớp lót đơn giản:
$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'
-d
ghi chú nhỏ .