Saya memiliki daftar angka dalam file, satu per baris. Bagaimana saya bisa mendapatkan nilai minimum, maksimum, median dan rata - rata ? Saya ingin menggunakan hasil dalam skrip bash.
Meskipun situasi langsung saya adalah untuk bilangan bulat, solusi untuk angka floating-point akan berguna di telepon, tetapi metode bilangan bulat sederhana baik-baik saja.
bash
awk
arithmetic
bc
Peter.O
sumber
sumber
Jawaban:
Anda dapat menggunakan bahasa pemrograman R .
Berikut ini adalah skrip R cepat dan kotor:
Perhatikan
"stdin"
discan
mana merupakan nama file khusus untuk dibaca dari input standar (artinya dari pipa atau pengalihan).Sekarang Anda dapat mengarahkan ulang data Anda melalui stdin ke skrip R:
Juga berfungsi untuk floating point:
Jika Anda tidak ingin menulis file skrip R, Anda dapat memanggil true-liner (dengan linebreak hanya untuk keterbacaan) di baris perintah menggunakan
Rscript
:Baca manual R yang bagus di http://cran.r-project.org/manuals.html .
Sayangnya referensi lengkap hanya tersedia dalam PDF. Cara lain untuk membaca referensi adalah dengan mengetikkan
?topicname
prompt sesi R interaktif.Untuk kelengkapan: ada perintah R yang menampilkan semua nilai yang Anda inginkan dan banyak lagi. Sayangnya dalam format ramah manusia yang sulit diurai secara terprogram.
sumber
r-base
.R
bahasa jelas yang terbaik untuk kebutuhan saya dalam situasi ini .. Sesuai jawaban Gilles,Rscript
antarmuka ke file skrip paling tepat (vs.R
, yang merupakan antarmuka interaktif) ... dan R di terminal membuat kalkulator yang berguna , atau uji lingkungan (seperti python :)cat datafile | Rscript -e 'print(summary(scan("stdin")));'
Saya sebenarnya menyimpan sedikit program awk untuk memberikan jumlah, jumlah data, datum minimum, datum maksimum, rata-rata dan median dari satu kolom data numerik (termasuk angka negatif):
Script di atas membaca dari stdin, dan mencetak kolom-kolom output yang dipisahkan tab pada satu baris.
sumber
NR==1
can go (a-use-of-of-use) jika) bersamaan dengan pemeriksaan min / maks, sehingga semua inisialisasi dapat ditemukan di bagian BEGIN (bagus!) ... Mengizinkan komentar juga merupakan sentuhan yang bagus .. Terima kasih, +1 ...awk
akan menganggap variabel "baru" adalah nol, jadi dalam hal iniBEGIN{}
bagian tersebut tidak perlu. Saya telah memperbaiki bungkusnya (tidak perlu keluar dari jeda baris juga). Saya juga terbiasaOFS="\t"
membersihkanprint
baris dan menerapkan komentar kedua @ Peter.O. (Ya, regex saya memungkinkan.
, tetapi sebagaiawk
mengartikannya sebagai0
, itu dapat diterima.)awk
Skrip saya sekarang jauh berbeda. Saya hampir merasa seperti Anda harus mengambil kredit untuk program di atas, untuk memberikan kredit di mana kredit jatuh tempo.Dengan datamash GNU :
sumber
brew install datamash
memberi Anda versi yang berfungsi untuk macOS, jika Anda memiliki Hombrew yang diinstal.Min, maks dan rata-rata cukup mudah didapat dengan awk:
Menghitung median sedikit lebih rumit, karena Anda perlu mengurutkan angka dan menyimpan semuanya dalam memori untuk sementara waktu atau membacanya dua kali (pertama kali menghitungnya, kedua - untuk mendapatkan nilai median). Berikut adalah contoh yang menyimpan semua angka dalam memori:
sumber
asort
daripada pipedsort
, dan sepertinya menyortir bilangan bulat dan desimal dengan benar .. Berikut adalah tautan ke versi tempel paste.ubuntu.com/612674 saya ... (Dan catatan untuk Kim: Saya telah bereksperimen dengan awk selama beberapa jam sekarang. (Bekerja dengan contoh minat pribadi adalah cara yang lebih baik bagi saya) ... Catatan umum untuk pembaca: Saya masih tertarik untuk melihat metode lain. semakin kompak semakin baik. Saya akan menunggu beberapa saat ...pythonpy bekerja dengan baik untuk hal seperti ini:
sumber
Minimum:
Maksimum:
Median:
Rata-rata:
Dalam
jq
opsi-s
(--slurp
) buat array untuk jalur input setelah mengurai setiap baris sebagai JSON, atau sebagai nomor dalam kasus ini.sumber
sumber
echo file.txt
sepertinya tidak benar, mungkincat
Dan liner satu (panjang) Perl, termasuk median:
Opsi khusus yang digunakan adalah:
-0777
: baca seluruh file sekaligus, bukan baris demi baris-a
: autosplit ke dalam array @FVersi skrip yang lebih mudah dibaca dari hal yang sama adalah:
Jika Anda ingin desimal, gantikan
%d
dengan sesuatu seperti%.2f
.sumber
Simple-r adalah jawabannya:
Ia menggunakan lingkungan R untuk menyederhanakan analisis statistik.
sumber
Hanya demi memiliki berbagai opsi yang disajikan pada halaman ini, Berikut adalah dua cara lagi:
1: oktaf
Ini adalah contoh oktaf cepat.
2: bash + alat tujuan tunggal .
Agar bash menangani angka floating-point, skrip ini menggunakan
numprocess
dannumaverage
dari paketnum-utils
.PS. Saya juga memiliki pandangan yang masuk akal
bc
, tetapi untuk pekerjaan khusus ini, ia tidak menawarkan apa pun selain apa yangawk
dilakukannya. Ini adalah (seperti 'c' dalam 'bc' menyatakan) kalkulator — kalkulator yang membutuhkan banyak pemrogramanawk
dan skrip bash ini ...sumber
Saya akan memilih lesmana kedua dari R dan menawarkan program R pertama saya. Bunyinya satu angka per baris pada input standar dan menulis empat angka (min, maks, rata-rata, median) yang dipisahkan oleh spasi ke output standar.
sumber
R
adalah antarmuka interaktif, danRscript
mendorong file skrip, yang dapat dieksekusi sesuai contoh Anda hash-bang , atau dipanggil dari dalam skrip bash .. Skrip dapat menangani args baris perintah (mis. stackoverflow.com/questions/2045706/... ) sehingga terlihat bagus ... Juga ekspresi R dapat digunakan dalam bash melalui-e
... tetapi Saya heran bagaimana jikaR
dibandingkan denganbc
...Di bawah
sort
/awk
tandem melakukannya:(Ini menghitung median sebagai rata-rata dari dua nilai pusat jika jumlah nilai genap)
sumber
Mengambil petunjuk dari kode Bruce, berikut ini adalah implementasi yang lebih efisien yang tidak menyimpan seluruh data dalam memori. Sebagaimana dinyatakan dalam pertanyaan, diasumsikan bahwa file input memiliki (paling banyak) satu nomor per baris. Itu menghitung baris dalam file input yang berisi angka yang memenuhi syarat dan melewati hitungan ke
awk
perintah bersama dengan (sebelumnya) data yang diurutkan. Jadi, misalnya, jika file tersebut berisimaka input ke
awk
sebenarnyaKemudian
awk
skrip menangkap jumlah data dalamNR==1
blok kode dan menyimpan nilai tengah (atau dua nilai tengah, yang dirata-rata untuk menghasilkan median) ketika melihatnya.sumber
cat
perintah yang tidak perlu ; lihat UUOC . … (Lanjutan)FILENAME
dan Anda tahu apa yang Anda tetapkan, tetapi, secara umum, Anda harus selalu mengutip variabel shell kecuali Anda memiliki alasan yang baik untuk tidak melakukannya, dan Anda yakin Anda tahu apa yang Anda lakukan. (4) Baik jawaban Anda maupun Bruce mengabaikan input negatif (yaitu, angka yang dimulai dengan-
); tidak ada dalam pertanyaan yang menyarankan bahwa ini adalah perilaku yang benar atau yang diinginkan. Jangan merasa buruk; sudah lebih dari empat tahun, dan, rupanya, saya orang pertama yang memperhatikan.cat
dan menambahkan penjelasan.Ini
num
adalahawk
pembungkus kecil yang persis melakukan ini dan banyak lagi, misalnyaitu menyelamatkan Anda dari menciptakan kembali roda di awk ultra-portabel. Dokumen diberikan di atas, dan tautan langsung di sini (periksa juga halaman GitHub ).
sumber
Dengan
perl
:sumber
cat/python
satu-satunya solusi - bukan bukti input kosong!sumber
Jika Anda lebih tertarik pada utilitas daripada menjadi keren atau pintar, maka itu
perl
adalah pilihan yang lebih mudah daripadaawk
. Pada umumnya ini akan ada di setiap * nix dengan perilaku konsisten, dan mudah dan gratis untuk menginstal di windows. Saya pikir itu juga kurang samar daripadaawk
, dan akan ada beberapa modul statistik yang dapat Anda gunakan jika Anda ingin setengah jalan antara menulis sendiri dan sesuatu seperti R. Saya cukup belum diuji (sebenarnya saya tahu itu memiliki bug tetapi berfungsi untuk tujuan saya )perl
skrip membutuhkan waktu sekitar satu menit untuk menulis, dan saya kira satu-satunya bagian rahasia akan menjadiwhile(<>)
, yang merupakan singkatan yang sangat berguna, yang berarti mengambil file yang dilewatkan sebagai argumen baris perintah, membaca satu baris pada satu waktu dan meletakkan baris dalam variabel khusus$_
. Jadi Anda bisa meletakkan ini dalam file bernama count.pl dan menjalankannya sebagaiperl count.pl myfile
. Terlepas dari itu, jelas sekali menyakitkan apa yang terjadi.sumber
sumber
sh
) sebagai penerjemah. Ada juga masalah dengan bagaimana data dibaca ke dalam array dari file.