Linux-Befehl oder -Skript, das doppelte Zeilen in einer Textdatei zählt?


116

Wenn ich eine Textdatei mit folgendem Inhalt habe

red apple
green apple
green apple
orange
orange
orange

Gibt es einen Linux-Befehl oder ein Linux-Skript, mit dem ich das folgende Ergebnis erzielen kann?

1 red apple
2 green apple
3 orange

Antworten:


214

Senden Sie es durch sort(um benachbarte Elemente zusammenzusetzen) und uniq -cgeben Sie dann die Anzahl an, dh:

sort filename | uniq -c

und um diese Liste in sortierter Reihenfolge (nach Häufigkeit) zu erhalten, können Sie

sort filename | uniq -c | sort -nr

48

Fast das gleiche wie bei Borribles, aber wenn Sie den dParameter hinzufügen , werden uniqnur Duplikate angezeigt .

sort filename | uniq -cd | sort -nr

1
Daumen hoch für die kleine -dNotiz.
September

6

uniq -c file

und falls die Datei noch nicht sortiert ist:

sort file | uniq -c


3

Versuche dies

cat myfile.txt| sort| uniq

Ohne die Flags -c oder -d unterscheidet uniq keine doppelten Zeilen von nicht doppelten Zeilen, oder fehlt mir etwas?
Drevicko


2

Können Sie mit einer alphabetischen, geordneten Liste leben:

echo "red apple
> green apple
> green apple
> orange
> orange
> orange
> " | sort -u 

?

green apple
orange
red apple

oder

sort -u FILE

-u steht für einzigartig und Einzigartigkeit wird nur durch Sortieren erreicht.

Eine Lösung, die die Ordnung bewahrt:

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

und mit einer Datei

cat file | { 
old=""
while read line
do
  if [[ $line != $old ]]
  then
    echo $line
    old=$line
  fi
done }

Die letzten beiden entfernen nur Duplikate, die sofort folgen - was zu Ihrem Beispiel passt.

echo "red apple
green apple
lila banana
green apple
" ...

Druckt zwei Äpfel, die durch eine Banane geteilt sind.


0

Um nur eine Zählung zu bekommen:

$> egrep -o '\w+' fruits.txt | sort | uniq -c

      3 apple
      2 green
      1 oragen
      2 orange
      1 red

So erhalten Sie eine sortierte Anzahl:

$> egrep -o '\w+' fruits.txt | sort | uniq -c | sort -nk1
      1 oragen
      1 red
      2 green
      2 orange
      3 apple

BEARBEITEN

Aha, das war NICHT entlang der Wortgrenzen, mein schlechtes. Hier ist der Befehl für vollständige Zeilen:

$> cat fruits.txt | sort | uniq -c | sort -nk1
      1 oragen
      1 red apple
      2 green apple
      2 orange

0

Hier ist ein einfaches Python-Skript mit dem Zählertyp . Der Vorteil besteht darin, dass hierfür die Datei nicht sortiert werden muss, im Wesentlichen ohne Speicher:

import collections
import fileinput
import json

print(json.dumps(collections.Counter(map(str.strip, fileinput.input())), indent=2))

Ausgabe:

$ cat filename | python3 script.py
{
  "red apple": 1,
  "green apple": 2,
  "orange": 3
}

oder Sie können einen einfachen Einzeiler verwenden:

$ cat filename | python3 -c 'print(__import__("json").dumps(__import__("collections").Counter(map(str.strip, __import__("fileinput").input())), indent=2))'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.