Wenn ich eine Zeichenfolge "1 2 3 2 1" oder ein Array [1,2,3,2,1] habe, wie kann ich die eindeutigen Werte auswählen, d. H.
"1 2 3 2 1" produces "1 2 3"
oder
[1,2,3,2,1] produces [1,2,3]
Ähnlich wie uniq, aber uniq scheint auf ganzen Linien zu funktionieren, nicht auf Mustern innerhalb einer Linie ...
bash
Array meinen , fügte einen Weg hinzuWenn Sie zsh verwenden:
oder (wenn die
KSH_ARRAYS
Option nicht eingestellt ist) sogarquelle
"${(u)array[@]}"
oder"${(@u)array}"
verwenden (beachten Sie die Anführungszeichen).${(u)array}
arbeite auch dann, wenn das Array leer ist oder eine leere Zeichenfolge ohne Anführungszeichen enthält.Für ein Array mit beliebigen Werten ist es ziemlich schwierig,
bash
da es keinen eingebauten Operator dafür hat.bash
Das Speichern von NUL-Zeichen in seinen Variablen wird jedoch nicht unterstützt. Sie können dies also verwenden, um dies an andere Befehle zu übergeben:Das Äquivalent von
zsh
's:auf einem neueren GNU-System könnte sein:
Alternativ können Sie in neueren Versionen von
bash
und unter der Annahme, dass keines der Array-Elemente leer ist, assoziative Arrays verwenden:Mit Bash 4.4 und neuer und mit GNU
sort
:Die Reihenfolge der Elemente wäre in diesen verschiedenen Lösungen nicht gleich.
Mit
tcsh
:Würde behalten die f irst Element (
a b a
=>a b
) , wiezsh
‚s(u)
Expansion Flagge.Würde das letzte (
a b a
=>b a
) behalten . Diese entfernen jedoch leere Elemente aus dem Array.quelle
Diese Lösung hat bei mir funktioniert.
Das Obige erzeugt 1 2 3 als Ausgabe.
Kürzere Version, wie von Costas vorgeschlagen, könnte sein,
Um die Endergebnisse in einem Array zu speichern, können Sie Folgendes tun:
Wenn ich jetzt ein Echo mache
arr
, ist dies die Ausgabe, die ich bekomme.Verweise
https://stackoverflow.com/a/13648438/1742825 https://stackoverflow.com/a/9449633/1742825
quelle
tr '\n' ' '
Um es vollständig in der Shell zu tun und das Ergebnis in ein Array zu setzen,
In Worten: Wenn wir ein bestimmtes Wort noch nicht gesehen haben, fügen Sie es dem
result
Array hinzu und markieren Sie es als gesehen. Sobald ein Wort gesehen wurde, ignorieren Sie nachfolgende Erscheinungen.quelle
unset seen
zuvor einendeclare -A seen
Fall benötigen, der$seen
zuvor definiert wurde (auch als skalare Variable aus der Umgebung).