Jak wydrukować tylko zduplikowane wartości z pliku tekstowego?

68

Załóżmy, że istnieje kolumna wartości liczbowych, takich jak:

Plik 1:

1 
2
3
3
3
4
4
4
5
6

Chcę wynik:

3  
4

Oznacza to, że tylko powtarzające się linie. Czy są jakieś narzędzia wiersza poleceń, aby dowiedzieć się tego w Linuksie? (Uwaga: wartości są sortowane numerycznie).

MiNdFrEaK
źródło
3
Zobaczyć man uniq.
jasonwryan

Odpowiedzi:

118

Możesz użyć uniq(1)do tego:

uniq -d file.txt

Spowoduje to wydrukowanie tylko duplikatów. Plik wejściowy musi być posortowany w taki sposób, aby wszystkie duplikaty były następujące po sobie (jak się wydaje), więc najpierw uruchom sortowanie, jeśli tak nie jest.

camh
źródło
1
co jeśli chcę, aby wydrukowano tylko trzy egzemplarze?
MiNdFrEaK
8
@MiNdFrEaK sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'dla trzech powtórzeń; zamień „3” na N dla N-płytek
full.stack.ex 22.10
@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'dla trzech powtórzeń
@camh, czy możesz to zrobić również na plikach csv? tylko wartości z określonej kolumny?
NumenorForLife,
1
sort file.txt | uniq -d
ron
1

Korzystanie uniqi awk:

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'
Ricardo Reyes
źródło
6
To działa, ale nie rozumiem, dlaczego przesyłacie dane wyjściowe cat?
Bernhard
1
nie każdy wie, że możesz to zrobić uniq -c File1i podobnie z wieloma innymi narzędziami. Prawdopodobnie o to tu chodzi.
Matthias
1

Wykonaj to: perl -ne 'print if $a{$_}++' filename.txt

Sanjay Nair
źródło
Daje 3\n3\n4\n\4nwejściowy plik 1, który jest oczywiście błędny.
yaegashi,
snip Perla, który odwiedzam, podaje liczbę przypadków każdego wiersza, dzięki czemu można go odpowiednio potokować, sortować i filtrować: perl -ne '$ a {$ _} ++; END {while (($ k, $ v) = każdy% a) {printf "% d \ t% s", $ v, $ k}} 'nazwa pliku
Theophrastus
Czy można to zrobić w określonej kolumnie oddzielonej danym separatorem pól?
Geremia,
Jak wskazał yaegashi, potrzebna jest niewielka poprawka, aby spełnić wymagania: perl -ne 'print if 1 == $ a {$ _} ++' filename.txt Spośród wszystkich odpowiedzi jest to moja ulubiona, ponieważ inne odpowiedzi wymagają pełnego przetworzenia wszystkich danych. Ta odpowiedź uruchamia wyniki wyjściowe szybciej i wydajniej.
BOC