Neden uniq -c komutu başında boşluk bıraktı?


11

Bir kabuk komut dosyasında bu kodu var:

sort input | uniq -c | sort -nr > output

Girdi dosyasında önceki boşluklar yoktu, ancak çıktıda var. Bunu nasıl düzeltirim? Bu bashta

Yanıtlar:


13

Uniq'in varsayılan davranışı, 7 boşluk genişliğindeki bir satırdaki frekansı sağa yaslamak, ardından frekansı tek bir boşlukla öğeden ayırmaktır.

Kaynak: https://www.thelinuxrain.com/articles/tweaking-uniq-c

Baştaki boşlukleri sed ile kaldırın:

$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output

2
7 boşluk, aka "bir sekmeden daha az".
chrylis -on strike-

Daha sonra sekmelerle benzer bir şeyle ayırabilirsiniz perl -pe 's/ *(\d+) /$1\t/'( burada bazı alternatifler ). xclip -selection cDoğrudan bir e-tabloya yapıştırmak için panoya da boru ekleyin.
Pablo Bianchi

5

uniq -cönde gelen boşluk ekler. Örneğin

$ echo test
test
$ echo test | uniq -c
      1 test

Kaldırmak için boru hattının sonuna bir komut ekleyebilirsiniz. Örneğin

$ echo test | uniq -c | sed 's/^\s*//'
1 test

1

FWIW daha fazla esneklik için farklı bir sıralama aracı kullanabilirsiniz. Python böyle bir araçtır.

Kaynak

#!/usr/bin/python3
import sys, operator, collections

counter = collections.Counter(map(operator.methodcaller('rstrip', '\n'), sys.stdin))
for item, count in counter.most_common():
    print(count, item)

Teoride sort, yukarıdaki program sıralı bir liste yerine yinelenen satırları tanımlamak için bir karma tablo kullandığından, bu büyük girdiler için araçtan bile daha hızlı olacaktır . (Ne yazık ki, özdeş sayım çizgilerini doğal bir düzen yerine isteğe bağlı olarak yerleştirir; bu değiştirilebilir ve yine de iki sortçağrıdan daha hızlı olabilir .)

Çıkış biçimi

Çıktı biçiminde daha fazla esneklik istiyorsanız print()ve format()yerleşik işlevlere bakabilirsiniz .

Örneğin, sayım numarasını sekiz başa kadar önde gelen sıfırlarla ve ardından NUL satır sonlandırıcılı boşluk karakteri yerine bir sekme ile yazdırmak istiyorsanız, son satırı aşağıdaki ile değiştirin:

    print(format(count, '08o'), item, sep='\t', end='\0')

kullanım

Komut dosyasını bir dosyada sort_count.pysaklayın , söyleyin ve Python ile çağırın:

python3 sort_count.py < input

0
uniq -c -i | tr -s ' ' | cut -c 2-

Öncü boşlukları tr -s ile tek boşluk içine çevirin ve sonra cut -c ile 2. karakterden çıktı alın.


Çözümünüz, boşluk dizisinin tüm oluşumlarını sıkıştıracaktır. Bu istenen etkidir.
Marc Vanhoomissen
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.