it-swarm-fr.com

Comment obtenir uniquement les résultats uniques sans avoir à trier les données?

$ cat data.txt 
aaaaaa
aaaaaa
cccccc
aaaaaa
aaaaaa
bbbbbb
$ cat data.txt | uniq
aaaaaa
cccccc
aaaaaa
bbbbbb
$ cat data.txt | sort | uniq
aaaaaa
bbbbbb
cccccc
$

Le résultat dont j'ai besoin est de afficher toutes les lignes du fichier d'origine en supprimant tous les doublons (pas seulement les consécutifs), tout en conservant l'ordre d'origine des instructions dans le fichier.

Ici, dans cet exemple, le résultat que je cherchais était

aaaaaa
cccccc
bbbbbb

Comment puis-je effectuer cette opération généralisée de uniq en général?

43
Lazer
Perl -ne 'print unless $seen{$_}++' data.txt

Ou, si vous devez avoir un tilisation inutile de cat :

cat data.txt | Perl -ne 'print unless $seen{$_}++'

Voici une traduction awk, pour les systèmes sans Perl:

awk '!seen[$0]++' data.txt
cat data.txt | awk '!seen[$0]++'
57
cjm

john possède un outil appelé unique:

[email protected] % cat data.txt | unique out
[email protected] % cat out
aaaaaa
cccccc
bbbbbb

Réaliser la même chose sans outils supplémentaires dans une seule ligne de commande est un peu plus complexe:

[email protected] % cat data.txt | nl | sort -k 2 | uniq -f 1 | sort -n | sed 's/\s*[0-9]\+\s\+//'
aaaaaa
cccccc
bbbbbb

nl imprime les numéros de ligne devant les lignes, donc si nous sort/uniq derrière eux, nous pouvons restaurer l'ordre d'origine des lignes. sed supprime simplement les numéros de ligne par la suite;)

13
binfalse

Je préfère utiliser ceci:

cat -n data.txt | sort --key=2.1 -b -u | sort -n | cut -c8-

cat -n ajoute des numéros de ligne,

sort --key=2.1 -b -u trie sur le deuxième champ (après les numéros de ligne ajoutés), en ignorant les blancs en tête, en conservant les lignes uniques

sort -n trie par ordre numérique strict

cut -c8- conserver tous les caractères de la colonne 8 à EOL (c'est-à-dire, omettre les numéros de ligne que nous avons inclus)

6
menkus

Perl a un module que vous pouvez utiliser qui inclut une fonction appelée uniq. Donc, si vous avez vos données chargées dans un tableau en Perl, vous appelez simplement la fonction comme ceci pour la rendre unique, tout en conservant l'ordre d'origine.

use List::MoreUtils qw(uniq)    
@output = uniq(@output);

Vous pouvez en savoir plus sur ce module ici: List :: MoreUtils

2
slm