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
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:
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.
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
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))'
-d
Notiz.