Wie drucke ich nur die doppelten Werte aus einer Textdatei?

69

Angenommen, es gibt eine Spalte mit folgenden numerischen Werten:

Datei1:

1 
2
3
3
3
4
4
4
5
6

Ich möchte die Ausgabe:

3  
4

Das heißt, nur die wiederholten Zeilen. Gibt es Befehlszeilentools, um dies unter Linux herauszufinden? (Hinweis: Die Werte sind numerisch sortiert).

MiNdFrEaK
quelle
3
Sehen man uniq.
Jasonwryan
Verwandte, schwierigere Frage: Doppelte Zeilen paarweise löschen
Wildcard

Antworten:

118

Sie können dafür verwenden uniq(1):

uniq -d file.txt

Dadurch werden nur die Duplikate ausgedruckt. Die Eingabedatei muss so sortiert werden, dass alle Duplikate aufeinanderfolgend sind (wie es scheint). Wenn dies nicht der Fall ist, führen Sie die Sortierung zuerst durch.

camh
quelle
1
Was ist, wenn ich möchte, dass die Dreifachauszüge nur gedruckt werden?
MiNdFrEaK
8
@MiNdFrEaK sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'für Triplikate; Ersetzen Sie "3" durch ein beliebiges N für N-Plikate
full.stack.ex
@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'für Dreiergruppen
@camh können Sie dies auch für CSV-Dateien tun? nur Werte einer bestimmten Spalte?
NumenorForLife
1
sortiere file.txt | uniq -d
ron
1

Verwenden uniqund awk:

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'
Ricardo Reyes
quelle
6
Diese Arbeit, aber ich verstehe nicht, warum Sie die Ausgabe von Pipe cat?
Bernhard
1
Nicht jeder weiß, dass Sie es uniq -c File1mit vielen anderen Tools genauso machen können. Das ist wahrscheinlich, was hier los ist.
Matthias
1

Führen Sie dies aus: perl -ne 'print if $a{$_}++' filename.txt

Sanjay Nair
quelle
Es gibt 3\n3\n4\n\4nfür die Eingabe File1 was offensichtlich falsch ist.
Yaegashi
Der Perl-Snip, den ich wiederhole, gibt die Anzahl der Vorkommen jeder Zeile an, damit er nach Bedarf weitergeleitet, sortiert und gefiltert werden kann: perl -ne '$ a {$ _} ++; END {while (($ k, $ v) = jeweils% a) {printf "% d \ t% s", $ v, $ k}} 'Dateiname
Theophrastus
Gibt es eine Möglichkeit, dies für eine bestimmte Spalte zu tun, die durch ein bestimmtes Feldtrennzeichen getrennt ist?
Geremia
Wie von yaegashi angegeben, ist eine kleine Korrektur erforderlich, um die Anforderungen zu erfüllen: perl -ne 'print if 1 == $ a {$ _} ++' filename.txt Unter allen Antworten ist es mein Favorit, weil die anderen Antworten müssen alle Daten mit einer vollständigen Sortierung vorverarbeiten. Diese Antwort startet die Ausgabe der Ergebnisse schneller und effizienter.
BOC
0

uniq setzt voraus, dass Ihre Liste sortiert ist. Standardmäßig alphabetisch sortieren

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

oder

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

jasonleonhard
quelle