लिनक्स कमांड या स्क्रिप्ट एक पाठ फ़ाइल में डुप्लिकेट लाइनों की गिनती?


116

यदि मेरे पास निम्नलिखित केंट के साथ एक पाठ फ़ाइल है

red apple
green apple
green apple
orange
orange
orange

क्या कोई लिनक्स कमांड या स्क्रिप्ट है जिसे मैं निम्नलिखित परिणाम प्राप्त करने के लिए उपयोग कर सकता हूं?

1 red apple
2 green apple
3 orange

जवाबों:


214

इसके माध्यम से भेजें sort(आसन्न वस्तुओं को एक साथ रखने के लिए) फिर uniq -cमायने रखने के लिए, यानी:

sort filename | uniq -c

और उस सूची को क्रमबद्ध रूप से प्राप्त करने के लिए (आवृत्ति द्वारा) आप कर सकते हैं

sort filename | uniq -c | sort -nr

48

लगभग बोरिबेल्स जैसा ही है, लेकिन अगर आप इसे dपरम जोड़ते हैं uniqतो केवल डुप्लिकेट दिखाता है।

sort filename | uniq -cd | sort -nr

1
छोटे -dनोट के लिए अंगूठे ।
sepehr

6

uniq -c file

और यदि फ़ाइल पहले से ही सॉर्ट न की गई हो:

sort file | uniq -c


3

इसे इस्तेमाल करे

cat myfile.txt| sort| uniq

बिना -c या -d झंडे के बिना, uniq डुप्लिकेट लाइनों को गैर-डुप्लिकेट से अलग नहीं करता है, या क्या मुझे कुछ याद आ रहा है?
drevicko


2

क्या आप एक वर्णमाला, क्रमबद्ध सूची के साथ रह सकते हैं:

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
" ...

दो सेब छपवाएंगे, एक केले से अलग कर देंगे।


0

बस एक गिनती पाने के लिए:

$> 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

0

यहाँ काउंटर प्रकार का उपयोग करते हुए एक सरल अजगर स्क्रिप्ट है । लाभ यह है कि इसके लिए फ़ाइल को क्रमबद्ध करने की आवश्यकता नहीं है, अनिवार्य रूप से शून्य मेमोरी का उपयोग करना:

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))'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.