Ich habe eine Schnur wie
"aaa,aaa,aaa,bbb,bbb,ccc,bbb,ccc"
Ich möchte doppelte Wörter aus der Zeichenfolge entfernen, dann wird die Ausgabe wie folgt sein
"aaa,bbb,ccc"
Ich habe diesen Code Source ausprobiert
$ echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
Es funktioniert gut mit demselben Wert, aber wenn ich meinen variablen Wert gebe, werden auch alle doppelten Wörter angezeigt.
Wie kann ich doppelte Werte entfernen?
AKTUALISIEREN
Meine Frage ist das Hinzufügen aller entsprechenden Werte zu einer einzelnen Zeichenfolge, wenn der Benutzer derselbe ist. Ich habe Daten wie diese ->
user name | colour
AAA | red
AAA | black
BBB | red
BBB | blue
AAA | blue
AAA | red
CCC | red
CCC | red
AAA | green
AAA | red
AAA | black
BBB | red
BBB | blue
AAA | blue
AAA | red
CCC | red
CCC | red
AAA | green
Beim Codieren rufe ich alle unterschiedlichen Benutzer ab und verkette dann die Farbzeichenfolge erfolgreich. Damit ich Code verwende -
while read the records
if [ "$c" == "" ]; then #$c I defined global
c="$colour1"
else
c="$c,$colour1"
fi
Wenn ich diese $ c-Variable drucke, erhalte ich die Ausgabe (für Benutzer AAA)
"red,black,blue,red,green,red,black,blue,red,green,"
Ich möchte doppelte Farben entfernen. Dann sollte die gewünschte Ausgabe wie folgt sein
"red,black,blue,green"
Für diese gewünschte Ausgabe habe ich den obigen Code verwendet
echo "zebra ant spider spider ant zebra ant" | xargs -n1 | sort -u | xargs
Es wird jedoch die Ausgabe mit doppelten Werten angezeigt
"rot, schwarz, blau, rot, grün, rot, schwarz, blau, rot, grün", danke
quelle
echo 'aaa aaa aaa bbb bbb ccc bbb ccc' | xargs -n1 | sort -u | xargs
gibtaaa bbb ccc
.. also müssen Sie den genauen Codes='aaa aaa aaa bbb bbb ccc bbb ccc'; echo "$s" | xargs -n1 | sort -u | xargs
Antworten:
Noch ein Awk, nur zum Spaß:
Übrigens funktioniert auch Ihre Lösung gut mit Variablen:
quelle
%s
anstelle von%s%s
. Der Grund dafür ist, dass ich eine for-Schleife durch die Ergebnisse gemacht habe und zwei Leerzeichen bei Regex-Übereinstimmungen einige Herausforderungen verursachten.Mit
tr
,sort
unduniq
oder
eine Zeile bekommen
quelle
| xargs
, um die Ausgabe wieder zu einer Zeile zu verbindensort -u
. Oder sogar einawk '!u[$0]++
.sort -u
. Ich habe diesort | uniq
ganze Zeit benutzt. Die verschwendeten Tastenanschläge ...quelle
Mit gnu
sed
:Sie können hinzufügen
;s/ */ /g
, um öffentliche Leerzeichen zu entfernen.Funktionen wie diese: Wenn ein Wort in dieser Zeile ein zweites Mal vorkommt, entfernen Sie es und beginnen Sie von vorne, bis keine Veröffentlichung mehr gefunden wird.
quelle
\<
und\>
?quelle
Obligatorische Awk-Lösung:
(Das Finale
echo
ist für die Newline da)quelle
sort
Lösung behält jedoch auch nicht die ursprüngliche Reihenfolge bei.awk -vRS=" " -vORS=" " '!a[$1]++ {print $1}' ; echo
Dadurch bleibt die Reihenfolge erhalten.Python
Option 1
Machen Sie eine ausführbare Datei und rufen Sie dann von Bash aus auf:
Oder Sie könnten es als Bash-Funktion implementieren, aber die Syntax ist chaotisch.
Option 2
Diese Option kann bei Bedarf zu einem Einzeiler werden:
In Bash:
quelle
quelle
awk
Implementierung (asorti()
ist keine Standardfunktionawk
).Verwenden der ursprünglichen Tabellendaten in der Datei mit dem Namen
file
:Dies erzeugt
Die drei Schritte der Pipeline:
sed
Befehl entfernt die erste Zeile, die eine Kopfzeile ist, die wir nicht lesen möchten.Der
sort
Befehl gibt uns eindeutige Zeilen. Die Beispieldaten nach sehensort
aus wieawk
Befehl verwendet diese Daten und erzeugt für jeden Benutzer im Array eine durch Kommas getrennte Zeichenfolgecolor
(wobei der Benutzername der Schlüssel zum Array ist). Am Ende (imEND
Block) werden alle gesammelten Daten ausgegeben.quelle
quelle