單詞統計。仍然先貼代碼,再講我的思路:
# Read from the file words.txt and output the word frequency list to stdout.
#!/bin/bash
awk '
BEGIN{
while(getline < "words.txt") {
for(i=1;i<=NF;i++) {
freq[$i]++;
}
}
n = asort(freq, dest);
for(word in freq) {
reversefreq[freq[word]] = word;
}
for (j=n;j>=1;j--) {
print reversefreq[dest[j]]" "dest[j];
}
}'
一、awk數組可以是按字符串取值,當然就想到用它,但是在其value遞增時,要不要先初始化爲0呢?另外,在判斷第一個word在不在array的index裏之前,是否需要聲明array呢?awk數組不需要聲明,且對value可以直接進行遞增操作。awk數組是我見過的最強大的數組。
二、按空格分割用到簡單的正則表達式,分隔符爲一個或多個空格,則正則表達式就是:
" +"
所有的正則表達式規則都一樣,Java的split函數,其參數也是可以用正則表達式的,例如:
String[] ssplit = s.split(" +");
也是分割一個或多個空格。不過awk使用$i取每一列的值時,已經有這樣的能力,不用再用正則表達式了。
三、asort()函數會破壞原數組的index,所以我們將排序放到dest數組上去。dest數組保存着freq數組的由小到大的value,這時候我們將freq數組的key和value互換,得到reversefreq數組。這樣,我們就能按照freq數組,取出相應的word了!這就是爲什麼題目裏有這麼一句:Don’t worry about handling ties, it is guaranteed that each word’s frequency count is unique.
總之,awk數組是我用過的最好用的數組了!