Uniq aynı zamanda uniq - unique'in olduğu kadar benzersiz değil mi?


35

İşte pastebin'den rastgele bir dosyadaki komutlar :

wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258

Adamın sayfaları -ubayrağın ne yaptığı konusunda net değil . Herhangi bir tavsiye?


4
Sıralama deneyin | uniq -d | wc -l ve farkı anlayabilirsiniz. :)
stoeff

Yanıtlar:


42

Kısa versiyon:

  • uniq, olmadan -u, çıktının her satırını benzersiz kılar .
  • uniq -usadece her benzersiz çizgi yazdırır girişten .

Biraz daha uzun versiyon:

uniqSatır çoğaltılmış dosyaları olan ve sadece bu satırlar girdi içinde art arda göründüğü zamanlar ile ilgilidir. Dolayısıyla, amaçları doğrultusunda, benzersiz bir çizgi hemen kopyalanmayandır.

( uniqçok sınırlı bir kısa süreli hafızaya sahip; girişin hemen başında bir satır gelmemişse, satırın daha önce görünüp görünmediğini asla hatırlayamayacak - bu yüzden uniqçok sık eşleştirildi sort.)

Yinelenen satırların bir çalışmasıyla karşılaştığında uniq, -uarg olmadan, bu satırın bir kopyasını yazdırır . (Çıktının her satırını benzersiz kılar ).

İle -uargüman, bu yazdırır sıfır sadece çıkışından atlanmış olsun çiftleri çalışır - bu hat kopyalarını.


1
Gerçekten sıralama gerektirmeyen bir seçenek olsaydı. Ancak tüm dosyanın bellekte tutulması gerekir (ya da kaynak normal bir dosya ise, hash ve ofsetlerle çok sayıda defter tutma)
Random832

3
@ Random832: ve hangilerinin saklanacağına karar verilmesini gerektirecek (ilk, son, başka bir şey, konfigüre edilebilir) ve bu kararın algoritmayı küresel olarak etkileyeceği. Güçlük.
Steve Jessop

1
@ Random832: Yazılacak karakter sayısı kadarsa, sort -uyerine kullanabilirsiniz sort | uniq.
oliver

@ lehim Ara sıra, herhangi bir satırın ilk örneğini yeniden düzenlemeden tutmak için bir yetenek istemiştim ve bunu yapmak için senaryolar yazdım.
Random832

1
@ hvd: Eğer sürümünüz uniqnormalleştirme ve harmanlama yaparsa, evet. Fakat o zaman bile sadece yerel bir mesele - sıralanan çıktıda çizginin nerede görüneceğini biliyorsunuz ve sadece birkaç bitişik çizgiden hangisini tutacağınızı seçmek zorundasınız. Girdi sıralanmadıysa, karar uniqifying işleminin tamamını etkiler, örneğin son kopyayı saklayacaksanız, girişteki son satırı okuyana kadar herhangi bir çıktı veremezsiniz ...
Steve Jessop

53

uniqile -uyinelenen satırları atlar. Böylece:

$ printf "%s\n" 1 1 2 3 | uniq
1
2
3
$ printf "%s\n" 1 1 2 3 | uniq -u
2
3

Genellikle, uniqsatırları en fazla bir kez yazdırır (sıralı giriş varsayarak). Bu seçenek aslında gerçekten benzersiz olan satırları yazdırır (bir daha görünmedi).


11
Diğer bir deyişle, tüm farklı satırları yazdırdığı için tüm benzersiz satırları yazdırdığı uniqiçin çağrılabilir . distinctuniq -u
Steve Jessop

Bazı yerel ayarlarda GNU ile gerçekten eşsiz değil uniq.
cuonglm

Kabul edilen yanıtı birkaç kez okumuş olmalıyım, ancak içeri girmedi. Çok açık bir şekilde ifade ettikten sonra örnek ve paragrafınız (ve geri dönüp kabul edilen cevabı tekrar okudum, bunu anlıyorum) :)
Madivad

18

uniq POSIX spec açıkça tanımladı:

-u
    Suppress the writing of lines that are repeated in the input.

-useçenek uniqtekrarlanan satırları yazdırmamak için yapın.

Çoğu uniquygulama, bayt karşılaştırmasını, GNU ise uniqçoğaltılmış satırları filtrelemek için harmanlama sırasını kullandı. Bu nedenle, bazı yerel ayarlarda, örneğin en_US.UTF-8yerel ayarda yanlış sonuç üretebilir :

$ printf '%b\n' '\U2460' '\U2461' | uniq
①

ve -usana hiç satır vermedi:

$ printf '%b\n' '\U2460' '\U2461' | uniq -u
<blank>

Bu nedenle Cbayt karşılaştırması elde etmek için yerel ayarları ayarlamanız gerekir :

$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=C uniq
①
②

3
Burada yanlış olan şeyin çok olmadığını unutmayın uniq(görünüşe göre POSIX'in amacı, strcoll () 'ın yerine') yerine comparison sort -uile aynı sıralama yapan yerel yerler gibi bayt karşılaştırması yapmasıydı . En azından GNU uniqile tutarlı sort -u.
Stéphane Chazelas 18:15

@ StéphaneChazelas - teknik özelliklerde görünen kısım nerededir?
mikeserv

Hakkında uniqbana çok belirgin değildir, strcoll karşı ancak memcmp / strcmp yapmak için gerekli Geoff etmek olduğunu . U ile aynı ② sıralamaya sahip GNU yerelleri hakkında, bu aynı şekilde sıralama yapmaları için hiçbir neden olmadığı için açıkça bir hatadır. Buna POSIX tarafından izin veriliyor ancak bazı değişiklikler geliyor .
Stéphane Chazelas

8

normal:

echo "a b a b c c c" | tr ' ' '\n'
a
b
a
b
c
c
c

uniq: sonraki iki yinelenen çizgi yok

echo "a b a b c c c" | tr ' ' '\n' | uniq
a
b
a
b
c

sıralanmış

echo "a b a b c c c" | tr ' ' '\n' | sort
a
a
b
b
c
c
c

sort -u: iki yinelenen satır yok

echo "a b a b c c c" | tr ' ' '\n' | sort -u
a
b
c

sort / uniq: hepsi farklı

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq
a
b
c

farklı oluşumları sayar

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq -c
2 a
2 b
3 c

sadece tekrarlanmayan satırlar (önce sıralanmamıştır)

echo "a b a b c c c" | tr ' ' '\n' | uniq -u
a
b
a
b

sadece tekrarlanmayan satırlar (sıralamadan sonra)

echo "a b a b c c c Z" | tr ' ' '\n' | sort | uniq -u
Z

uniq -d: her grup için sadece bir tane kopya satır yazdırır

echo "a b a b c c c" | tr ' ' '\n' | uniq -d
c

.. sayıldı

echo "a b a b c c c" | tr ' ' '\n' | uniq -dc
3 c

güzel net örnekler :)
Madivad
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.