Saya memiliki file tab delimited dengan beberapa kolom. Saya ingin menghitung frekuensi kemunculan nilai yang berbeda dalam kolom untuk semua file dalam folder dan mengurutkannya dalam urutan penghitungan yang menurun (jumlah tertinggi terlebih dahulu). Bagaimana saya melakukannya di lingkungan baris perintah Linux?
Itu dapat menggunakan bahasa baris perintah umum seperti awk, perl, python dll.
bash
command-line
frequency
sfactor
sumber
sumber
-d,
untuk membatasi bidang dengan koma atau pembatas lainnya).cut -f 1 -d ' '
. Terima kasih banyak. :)Situs GNU menyarankan skrip awk yang bagus ini, yang mencetak kata dan frekuensinya.
Perubahan yang mungkin terjadi:
sort -nr
(dan membalikkanword
danfreq[word]
) untuk melihat hasilnya dalam urutan menurun.freq[3]++
- ganti 3 dengan nomor kolom.Ini dia:
sumber
Perl
Kode ini menghitung kemunculan semua kolom, dan mencetak laporan yang diurutkan untuk masing-masing:
Simpan teks sebagai columnvalues.pl
Jalankan sebagai:
perl columnvalues.pl files*
Penjelasan
Di level teratas while loop:
* Ulangi setiap baris dari file input gabungan
* Pisahkan baris menjadi array @Fields
* Untuk setiap kolom, tambahkan struktur data array-of-hashes hasil
Di tingkat teratas untuk perulangan:
* Ulangi larik hasil
* Cetak nomor kolom
* Dapatkan nilai yang digunakan dalam kolom itu
* Urutkan nilai berdasarkan jumlah kejadian
* Urutan sekunder berdasarkan nilai (misalnya b vs g vs m vs z)
* Iterasi melalui hash hasil, menggunakan daftar yang diurutkan
* Cetak nilai dan jumlah setiap kemunculan
Hasil berdasarkan file input sampel yang disediakan oleh @Dennis
masukan .csv
Jika file masukan Anda adalah .csv, ubah
/\s+/
ke/,/
Obfuscation
Dalam kontes yang buruk, Perl dilengkapi dengan sangat baik.
Satu baris ini melakukan hal yang sama:
sumber
Ruby (1.9+)
sumber
each_with_object
, antara lain. Singkatnya, ini ditulis dengan kasar.