जवाबों:
क्या आप एक वर्णमाला, क्रमबद्ध सूची के साथ रह सकते हैं:
echo "red apple
> green apple
> green apple
> orange
> orange
> orange
> " | sort -u
?
green apple
orange
red apple
या
sort -u FILE
-u का मतलब अनोखा है, और विशिष्टता केवल छँटाई के माध्यम से पहुँचती है।
एक समाधान जो आदेश को संरक्षित करता है:
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
और, एक फ़ाइल के साथ
cat file | {
old=""
while read line
do
if [[ $line != $old ]]
then
echo $line
old=$line
fi
done }
अंतिम दो केवल डुप्लिकेट को हटाते हैं, जो तुरंत अनुसरण करते हैं - जो आपके उदाहरण पर फिट बैठता है।
echo "red apple
green apple
lila banana
green apple
" ...
दो सेब छपवाएंगे, एक केले से अलग कर देंगे।
बस एक गिनती पाने के लिए:
$> egrep -o '\w+' fruits.txt | sort | uniq -c
3 apple
2 green
1 oragen
2 orange
1 red
क्रमबद्ध गणना प्राप्त करने के लिए:
$> egrep -o '\w+' fruits.txt | sort | uniq -c | sort -nk1
1 oragen
1 red
2 green
2 orange
3 apple
संपादित करें
अहा, यह शब्द सीमा के साथ नहीं था, मेरा बुरा। यहां पूर्ण लाइनों के लिए उपयोग करने का आदेश दिया गया है:
$> cat fruits.txt | sort | uniq -c | sort -nk1
1 oragen
1 red apple
2 green apple
2 orange
यहाँ काउंटर प्रकार का उपयोग करते हुए एक सरल अजगर स्क्रिप्ट है । लाभ यह है कि इसके लिए फ़ाइल को क्रमबद्ध करने की आवश्यकता नहीं है, अनिवार्य रूप से शून्य मेमोरी का उपयोग करना:
import collections
import fileinput
import json
print(json.dumps(collections.Counter(map(str.strip, fileinput.input())), indent=2))
आउटपुट:
$ cat filename | python3 script.py
{
"red apple": 1,
"green apple": 2,
"orange": 3
}
या आप एक साधारण लाइनर का उपयोग कर सकते हैं:
$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'
-d
नोट के लिए अंगूठे ।