Comment imprimer uniquement les valeurs en double d'un fichier texte?

70

Supposons qu'il existe une colonne de valeurs numériques comme suit:

Fichier1:

1 
2
3
3
3
4
4
4
5
6

Je veux la sortie:

3  
4

C'est-à-dire, seulement les lignes répétées. Existe-t-il des outils en ligne de commande pour le savoir sous Linux? (NB: les valeurs sont triées numériquement).

MiNdFrEaK
la source
3
Voir man uniq.
jasonwryan
Question connexe, plus difficile: Supprimer les doublons deux à deux
Wildcard

Réponses:

120

Vous pouvez utiliser uniq(1)pour cela:

uniq -d file.txt

Ceci n’imprimera que les doublons. Le fichier d'entrée doit être trié de manière à ce que tous les doublons soient consécutifs (ce qui semble être le cas). Par conséquent, exécutez-le en premier si ce n'est pas le cas.

camh
la source
1
Et si je veux que les triplicats ne soient imprimés?
MiNdFrEaK
8
@MiNdFrEaK sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'pour les triplicats; remplace "3" par n'importe quel N pour N-plicates
full.stack.ex
@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'pour les triplicats
@camh pouvez-vous le faire également sur les fichiers csv? seulement les valeurs d'une certaine colonne?
NumenorForLife
1
trier fichier.txt | uniq -d
ron
1

Utiliser uniqet awk:

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'
Ricardo Reyes
la source
6
Ce travail, mais je ne vois pas pourquoi vous dirigez la sortie cat?
Bernhard
1
Tout le monde ne sait pas que vous pouvez le faire uniq -c File1et de la même manière avec de nombreux autres outils. C'est probablement ce qui se passe ici.
Matthias
1

Exécutez ceci: perl -ne 'print if $a{$_}++' filename.txt

Sanjay Nair
la source
Cela donne 3\n3\n4\n\4npour l'entrée File1 qui est évidemment fausse.
Yaegashi
la copie de Perl que je me retrouve à consulter fournit le nombre d'occurrences de chaque ligne afin qu'elle puisse être transférée, triée et filtrée selon les besoins: perl -ne '$ a {$ _} ++; END {while (($ k, $ v) = chaque% a) {printf "% d \ t% s", $ v, $ k}} 'nom de fichier
Theophrastus
Y a-t-il un moyen de faire cela sur une colonne spécifique séparée par un séparateur de champs donné?
Geremia
Comme indiqué par yaegashi, un petit correctif est nécessaire pour répondre à ces exigences: perl -ne 'print if 1 == $ a {$ _} ++' nomfichier.txt Parmi toutes les réponses, c’est ma préférée, car les autres réponses besoin de prétraiter toutes les données avec un tri complet. Cette réponse permet d’obtenir des résultats plus rapidement et efficacement.
BOC
0

uniq exige que votre liste soit commandée, le tri par défaut alphabétique

sort | uniq -d path/to/your/filename

ou

cat fileName | sort | uniq -d path/to/your/filename

jasonleonhard
la source