Bir dosyanın tüm satırlarının benzersiz olup olmadığını kontrol edin


11

Böyle satırları içeren bir metin dosyası var:

This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
.
.
.
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520

Her çizginin benzersizliğinden nasıl emin olabilirim?

NOT: Amaç dosyayı sınamaktır, yinelenen satırlar varsa dosyayı değiştirmektir.


1
Bağlantı kurma
Jeff Schaller

1
Tüm satırların benzersiz olup olmadığını kontrol etmek mi yoksa yinelenenleri kaldırmak mı istiyorsunuz?
8bittree

1
@ 8bittree - sadece emin olmak istiyoruz
snr

Yanıtlar:


24
[ "$(wc -l < input)" -eq "$(sort -u input | wc -l)" ] && echo all unique

Tam olarak ne söylerdim, uniqbunun dışındasort -u
Nonny Moose

1
Giriş zaten sıralanmamışsa, uniqbüyük bir hata olur; sadece bitişik satırları tekilleştirir!
alexis

1
Kişi suçlularla ilgilenirse sort <file> | uniq -d, kopyaları basar.
Rolf

25

Awk çözümü:

awk 'a[$0]++{print "dupes"; exit(1)}' file && echo "no dupes"

4
+1 Kabul edilen cevap tüm dosyayı iki kez okur, ancak bir okumada yinelenen bir satırla karşılaşır karşılaşmaz durur. Bu, borulu girişle de çalışacak, diğerleri ise yeniden okuyabileceği dosyalara ihtiyaç duyar.
JoL

echoİçine giremez misin END?
Ignacio Vazquez-Abrams

2
@ IgnacioVazquez-Abrams Ekoda gerçekten bir anlamı yok. Yapma && echoya || echocevapları bir kongre olan bir komut çıkış durum kodu ile doğru şeyi belirtmek için. Önemli olan exit(1). İdeal olarak, bunu aptalca if has_only_unique_lines file; then ...değil gibi kullanırsınız if [[ $(has_only_unique_lines file) = "no dupes" ]]; then ....
JoL

2
Hafızadan tasarruf etmek için diğer yanıtların dosyayı iki kez okuduğu durumlarda, dupes yoksa tüm dosyayı hafızaya okuyacaktır.
Kusalananda

1
@Kusalananda Bu, herhangi bir dupes olmadığında tüm dosyayı belleğe okuyacak olsa sortda, dupes olup olmamasına bakılmaksızın kullanmak da olacaktır, değil mi? Bu nasıl bellek tasarrufu sağlıyor?
JoL

21

sort/ Kullanarak uniq:

sort input.txt | uniq

Yalnızca yinelenen satırları kontrol etmek -diçin uniq seçeneğini kullanın . Bu yalnızca yinelenen satırları gösterir, hiçbiri yoksa hiçbir şey göstermez:

sort input.txt | uniq -d

Bu benim gotom. Diğer, daha yüksek oy alan cevapların, bunun cevap vermediğinden emin değilim.
user1717828

1
Kopyaları kaldırmak iyi bir alternatiftir.
snr

1
Bu onun istediğini yapmaz. Yinelemelerin olup olmadığını bilmek istiyor , onları kaldırmıyor.
Barmar

@Barmar: Bu şekilde görünse de soru hala belirsiz. OP'ler de bunu açıklığa kavuşturmaya çalışırken yorum yapıyor.
jesse_b

Daha fazla açıklama ekleyen bekleyen bir düzenleme var.
Barmar

5

TLDR

Orijinal soru belirsizdi ve OP'nin sadece bir dosyanın içeriğinin benzersiz bir sürümünü istediğini okuyun. Aşağıda gösterilmiştir. Sorunun güncelleştirilmiş biçiminde, OP şimdi dosyanın içeriğinin benzersiz olup olmadığını bilmek istediğini belirtiyor.


Dosyanın içeriğinin benzersiz olup olmadığını test edin

sortBir dosyanın benzersiz olup olmadığını veya bunun gibi kopyaları içerdiğini doğrulamak için kullanabilirsiniz :

$ sort -uC input.txt && echo "unique" || echo "duplicates"

Misal

Diyelim ki bu iki dosyam var:

yinelenen örnek dosya
$ cat dup_input.txt
This is a thread  139737522087680
This is a thread  139737513694976
This is a thread  139737505302272
This is a thread  139737312270080
This is a thread  139737203164928
This is a thread  139737194772224
This is a thread  139737186379520
benzersiz örnek dosyası
$  cat uniq_input.txt
A
B
C
D

Şimdi bu dosyaları analiz ettiğimizde benzersiz olduklarını veya kopyalarını içerdiğini söyleyebiliriz:

yinelenen dosyayı test et
$ sort -uC dup_input.txt && echo "unique" || echo "duplicates"
duplicates
benzersiz dosyayı test et
$ sort -uC uniq_input.txt && echo "unique" || echo "duplicates"
unique

Orijinal soru (dosyanın benzersiz içeriği)

Sadece aşağıdakilerle yapılabilir sort:

$ sort -u input.txt
This is a thread  139737186379520
This is a thread  139737194772224
This is a thread  139737203164928
This is a thread  139737312270080
This is a thread  139737505302272
This is a thread  139737513694976
This is a thread  139737522087680

3

Ben genellikle sortdosyayı, daha sonra uniqyinelenenlerin sayısını saymak için kullanın , sonra bir sortkez daha listenin altındaki yinelenenleri görüyorum.

Verdiğiniz örneklere bir kopya ekledim:

$ sort thread.file | uniq -c | sort
      1 This is a thread  139737186379520
      1 This is a thread  139737194772224
      1 This is a thread  139737203164928
      1 This is a thread  139737312270080
      1 This is a thread  139737513694976
      1 This is a thread  139737522087680
      2 This is a thread  139737505302272

Adam sayfasını bir uniqsüredir okumadığım için , alternatifleri hızlıca inceledim. Aşağıdakileri, yalnızca kopyaları görmek istiyorsanız, ikinci sıralama gereksinimini ortadan kaldırır:

$ sort thread.file | uniq -d
This is a thread  139737505302272

Gerçekten iyi bir alternatif. #rez
snr

2

Kopya yoksa, tüm satırlar benzersizdir:

[ "$(sort file | uniq -d)" ] && echo "some line(s) is(are) repeated"

Açıklama: Yinelenen satırları ardışık yapmak için dosya satırlarını sıralayın (sıralayın)
Eşit olan tüm ardışık satırları ayıklayın (uniq -d).
Yukarıdaki komutun ( [...]) çıktısı varsa , ( &&) bir mesaj yazdırın.


2

Bu bir Perl cevabı olmadan tamamlanmayacaktı!

$ perl -ne 'print if ++$a{$_} == 2' yourfile

Bu, benzersiz olmayan her satırı bir kez yazdırır: bu nedenle hiçbir şey yazdırmazsa, dosyanın tüm benzersiz satırları vardır.


1

Kullanılması cmpve sortiçinde bash:

cmp -s <( sort file ) <( sort -u file ) && echo 'All lines are unique'

veya

if cmp -s <( sort file ) <( sort -u file )
then
    echo 'All lines are unique'
else
    echo 'At least one line is duplicated'
fi

Bu, kabul edilen cevap gibi dosyayı iki kez sıralar.

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.