Bagaimana cara mencetak hanya nilai duplikat dari file teks?

70

Misalkan ada kolom nilai numerik seperti berikut:

File1:

1 
2
3
3
3
4
4
4
5
6

Saya ingin hasilnya:

3  
4

Artinya, hanya garis yang diulang. Apakah ada alat baris perintah untuk mengetahui ini di Linux? (NB: Nilai-nilai diurutkan secara numerik).

Pikiran aneh
sumber
3
Lihat man uniq.
jasonwryan
Terkait, pertanyaan yang lebih sulit: Hapus garis duplikat berpasangan
Wildcard

Jawaban:

119

Anda dapat menggunakan uniq(1)ini:

uniq -d file.txt

Ini akan mencetak duplikat saja. File input perlu disortir sedemikian rupa sehingga semua duplikat berurutan (yang tampaknya), jadi jalankan melalui sortir terlebih dahulu jika tidak.

camh
sumber
1
bagaimana jika saya ingin rangkap tiga hanya dicetak?
MiNdFrEaK
8
@MiNdFrEaK sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'untuk rangkap tiga; ganti "3" dengan sembarang N untuk pelat-N
full.stack.ex
@MiNdFrEaK sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'untuk rangkap tiga
@camh dapatkah Anda melakukan ini pada file csv juga? hanya nilai kolom tertentu?
NumenorForLife
1
sortir file.txt | uniq -d
ron
1

Menggunakan uniqdan awk:

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'
Ricardo Reyes
sumber
6
Ini bekerja, tapi saya tidak melihat mengapa Anda menyalurkan output cat?
Bernhard
1
tidak semua orang tahu yang dapat Anda lakukan uniq -c File1dan mirip dengan banyak alat lainnya. Mungkin itulah yang terjadi di sini.
Matthias
1

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

Sanjay Nair
sumber
Ini memberi 3\n3\n4\n\4nuntuk input File1 yang jelas salah.
yaegashi
Perl snip saya menemukan diri saya meninjau kembali menyediakan jumlah insiden setiap baris sehingga dapat disalurkan, disortir, dan disaring sesuai kebutuhan: perl -ne '$ a {$ _} ++; END {while (($ k, $ v) = setiap% a) {printf "% d \ t% s", $ v, $ k}} 'nama file
Theophrastus
Apakah ada cara untuk melakukan itu pada kolom tertentu yang dipisahkan oleh pemisah bidang tertentu?
Geremia
Seperti yang ditunjukkan oleh yaegashi, perbaikan kecil diperlukan untuk memenuhi persyaratan: perl -ne 'print if 1 == $ a {$ _} ++' filename.txt Di antara semua jawaban, itu adalah favorit saya, karena jawaban yang lain perlu memproses ulang semua data dengan semacam penuh. Jawaban ini memulai hasil keluaran dengan lebih cepat dan efisien.
BOC
0

uniq mengharuskan daftar Anda untuk dipesan, urutkan default ke abjad

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

atau

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

jasonleonhard
sumber