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
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:
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
perl -pe 's/ *(\d+) /$1\t/'
( burada bazı alternatifler ). xclip -selection c
Doğrudan bir e-tabloya yapıştırmak için panoya da boru ekleyin.
FWIW daha fazla esneklik için farklı bir sıralama aracı kullanabilirsiniz. Python böyle bir araçtır.
#!/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 .)
Çı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')
Komut dosyasını bir dosyada sort_count.py
saklayın , söyleyin ve Python ile çağırın:
python3 sort_count.py < input
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.