Saya perlu menemukan 10 kata paling sering dalam file .csv.
File terstruktur sehingga setiap baris berisi kata-kata yang dipisahkan koma. Jika kata yang sama diulang lebih dari satu kali dalam baris yang sama, itu harus dihitung sebagai satu.
Jadi, pada contoh di bawah ini:
green,blue,blue,yellow,red,yellow
red,blue,green,green,green,brown
hijau, biru dan merah harus dihitung sebagai 2 dan kuning dan coklat sebagai 1
Saya tahu pertanyaan serupa telah ditanyakan sebelumnya, dan salah satu solusinya adalah:
<file.csv tr -c '[:alnum:]' '[\n*]' | sort|uniq -c|sort -nr|head -10
Tapi ini akan menghitung berapa kali sebuah kata muncul di baris yang sama, seperti ini:
4 green
3 blue
2 yellow
2 red
1 brown
dan ini sebenarnya bukan yang saya butuhkan.
Ada bantuan? Saya juga akan menghargai penjelasan singkat tentang perintah tersebut dan mengapa perintah yang saya temukan dalam pertanyaan serupa tidak melakukan apa yang saya butuhkan.
Jawaban yang Diterima:
Saya mungkin akan meraih perl
- Gunakan
uniq
dariList::Util
modul untuk menghapus duplikat setiap baris. - Gunakan hash untuk menghitung kemunculan yang dihasilkan.
Misalnya
perl -MList::Util=uniq -F, -lnE '
map { $h{$_}++ } uniq @F
}{
foreach $k (sort { $h{$b} <=> $h{$a} } keys %h) {say "$h{$k}: $k"}
' file.csv
2: red
2: green
2: blue
1: yellow
1: brown
Jika Anda tidak memiliki pilihan kecuali sort
dan uniq
coreutils, maka Anda dapat mengimplementasikan algoritme serupa dengan penambahan loop shell
while IFS=, read -a words; do
printf '%s\n' "${words[@]}" | sort -u
done < file.csv | sort | uniq -c | sort -rn
2 red
2 green
2 blue
1 yellow
1 brown
namun silakan merujuk ke Mengapa menggunakan loop shell untuk memproses teks dianggap sebagai praktik yang buruk?