Mengapa perintah uniq -c menempatkan spasi di awal?

11

Saya memiliki kode ini dalam skrip shell:

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

File input tidak memiliki spasi putih sebelumnya, tetapi output tidak. Bagaimana cara saya memperbaikinya? Ini dalam bash

Jeremy Wik
sumber

Jawaban:

13

Perilaku default uniq adalah untuk membenarkan frekuensi dalam garis lebar 7 spasi, kemudian memisahkan frekuensi dari item dengan spasi tunggal.

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

Hapus spasi terkemuka dengan sed:

$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
Gounou
sumber
2
7 spasi, alias "hanya kurang dari satu tab".
chrylis -on strike-
Anda kemudian dapat memisahkan dengan tab dengan sesuatu seperti perl -pe 's/ *(\d+) /$1\t/'(di sini beberapa alternatif ). Juga pipa ke clipboard dengan xclip -selection cmenempel langsung ke spreadsheet.
Pablo Bianchi
5

uniq -cmenambahkan spasi putih terkemuka. Misalnya

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

Anda bisa menambahkan perintah di akhir pipa untuk menghapusnya. Misalnya

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

FWIW Anda dapat menggunakan alat penyortiran yang berbeda untuk lebih banyak fleksibilitas. Python adalah salah satu alat tersebut.

Sumber

#!/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)

Secara teori ini bahkan akan lebih cepat daripada sortalat untuk input besar karena program di atas menggunakan tabel hash untuk mengidentifikasi garis duplikat daripada daftar yang diurutkan. (Alas itu menempatkan garis hitungan identik dalam urutan sewenang-wenang bukannya tatanan alami; ini dapat diamandemen dan masih lebih cepat dari dua sortpemanggilan.)

Format output

Jika Anda menginginkan lebih banyak fleksibilitas pada format output, Anda dapat melihat ke dalam fungsi print()dan format()built-in.

Misalnya, jika Anda ingin mencetak angka hitungan dalam oktal dengan hingga 7 angka nol di depan dan diikuti oleh tab alih-alih karakter spasi dengan terminator garis NUL, ganti baris terakhir dengan:

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

Pemakaian

Simpan skrip dalam file, katakan sort_count.py, dan aktifkan dengan Python:

python3 sort_count.py < input
David Foerster
sumber
0
uniq -c -i | tr -s ' ' | cut -c 2-

Terjemahkan spasi putih terkemuka ke dalam spasi putih tunggal dengan tr -s dan kemudian cetak output dari karakter ke-2 dengan cut -c.

Ketan Gadwale
sumber
Solusi Anda akan memeras semua kejadian urutan spasi putih. Ini adalah efek yang diinginkan.
Marc Vanhoomissen