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
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
Jawaban:
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
perl -pe 's/ *(\d+) /$1\t/'
(di sini beberapa alternatif ). Juga pipa ke clipboard dengan xclip -selection c
menempel langsung ke spreadsheet.
FWIW Anda dapat menggunakan alat penyortiran yang berbeda untuk lebih banyak fleksibilitas. Python adalah salah satu alat tersebut.
#!/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 sort
alat 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 sort
pemanggilan.)
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')
Simpan skrip dalam file, katakan sort_count.py
, dan aktifkan dengan Python:
python3 sort_count.py < input
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.