Bir metin dosyasından sadece yinelenen değerler nasıl yazdırılır?


69

Aşağıdaki gibi bir sayısal değerler sütunu olduğunu varsayalım:

file1:

1 
2
3
3
3
4
4
4
5
6

Çıktıyı istiyorum:

3  
4

Yani, sadece tekrarlanan çizgiler. Bunu Linux'ta bulmak için herhangi bir komut satırı aracı var mı? (Not: Değerler sayısal olarak sıralanır).


3
Bakın man uniq.
jasonwryan

İlgili, daha zor soru: Sil yinelenen satırlar BÜKÜMÜ
Wildcard

Yanıtlar:


118

Bunun için kullanabilirsiniz uniq(1):

uniq -d file.txt

Bu sadece kopyaları basacaktır. Giriş dosyasının, tüm kopyaların ardışık (ki göründüğü gibi) olacak şekilde sıralanması gerekir; bu durumda değilse, önce sıralama yoluyla çalıştırın.


1
ya üç kopyaların yalnızca yazdırılmasını istiyorsam?
MiNdFrEaK

8
Üç kopyalar sort | uniq -c | grep '^\s*3\s' | sed 's/^\s*[0-9]*\s*//'için @MiNdFrEaK ; "3"
ü

Üç kopyalar sort | uniq -c | sed -n 's/^[[:blank:]]*3[[:blank:]]\{1,\}//p'için @MiNdFrEaK

@ camh bunu csv dosyalarında da yapabilir misiniz? yalnızca belirli bir sütunun değerleri?
NumenorForLife

1
dosya.txt sıralama | uniq -d
ron

1

Kullanılması uniqve awk:

cat File1  | uniq -c | awk '$1 > 1 { print $2 }'

6
Bu iş, ama neden çıktı verdiğini anlamıyorum cat?
Bernhard

1
Herkes yapabileceğini uniq -c File1ve benzer şekilde birçok araçla yapabileceğini bilmiyor . Muhtemelen burada olan budur.
Matthias

1

Bunu yürütün: perl -ne 'print if $a{$_}++' filename.txt


3\n3\n4\n\4nAçıkça yanlış olan File1 girişi için verir .
yaegashi

kendimi yeniden bulacağımı belirlediğim perl snip her satırın olay sayısını sağlar, böylece gerektiği gibi borulanır, sıralanır ve filtrelenir: perl -ne '$ a {$ _} ++; END {while (($ k, $ v) = her% a) {printf "% d \ t% s", $ v, $ k}} 'dosya adı
Theophrastus

Bunu, belirli bir alan ayırıcısıyla ayrılmış belirli bir sütunda yapmanın bir yolu var mı?
Geremia

Yaegashi tarafından belirtildiği gibi, gereklilikleri yerine getirmek için küçük bir düzeltme gerekiyor: perl -ne 'print eğer 1 == $ a {$ _} ++' dosyaadı. tüm verileri tam bir sıralamada önceden işleme koymanız gerekir. Bu cevap çıktı sonuçlarını daha hızlı ve verimli bir şekilde başlatır.
BOC

0

uniq listenin sıralanmasını gerektirir, varsayılanları alfabetik olarak sırala

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

veya

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.