Hier ist eine Option mit awk:
awk '{ while(++i<=NF) printf (!a[$i]++) ? $i FS : ""; i=split("",a); print ""}' infile > outfile
Bearbeiten mit Kommentaren aktualisiert:
while (++i<=NF)
Initialisiert die while-Schleife, wobei "i" vorweggenommen wird, da $ 0 die vollständige Zeile in awk ist.
Es beginnt also bei $ 1 (erstes Feld). Schleife durch die Zeile bis zum Ende (kleiner oder gleich "NF", das in "awk" für "Number of Fields" eingebaut ist). Das Standardfeldtrennzeichen ist ein Leerzeichen. Sie können das Standardtrennzeichen leicht ändern.
printf (!a[$i]++) ? $i FS : ""
Dies ist eine ternäre Operation .
Wenn sich die Eingabe nicht im Array befindet
!a[$i]++
, wird $ i ausgegeben. Wenn ja, wird "" ausgegeben. (Sie können das entfernen!
und umkehren,$i FS : ""
wenn Sie es auf diese Weise nicht mögen).i=split("",a)
Normalerweise ist das ein Nullsplit. In diesem Fall setzt ich I für die nächste Zeile zurück.
print ""
beendet die Zeile für die Ausgabe (nicht warum eigentlich 100%), andernfalls würden Sie Folgendes ausgeben:
1 2 3 5 4 1 2 3
anstatt
1 2 3
5 4 1 2 3