由於awk對於標準格式文本可以快速分割,因此我有時候懶得用python再去寫更長的腳本去做一些簡單的統計和打印工作。
比如,現有文本爲對一些符號的分類:
pre_groups:CH_DTL = z c s ì
pre_groups:CH_RTR = Z C S r î
用集合的語言來說,我希望,該分類滿足:
1. 完備性:所有的元素必須屬於某一個分類。
2. 唯一性:所有的元素僅能屬於一個分類,而不是多個。
那麼,我將使用awk進行快速統計,然後查看:
1. 每個元素是否只出現一次。
2. 所有出現的元素的個數與總元素個數是否相同。
awk可以幫我們第一點。
使用的命令爲:
cat 1.txt | sed -r -e 's/^.*= //g' | sed -r -e 's/ $//g' | awk -f stat_phoneme.awk > phon_stat.log
其中,awk的文件內容爲:
{for( i=1; i<= NF; i++) Number[$i]++ }
END { for( phon in Number) printf("%-10s %d\n", phon, Number[phon] )}
注意:
1. 如果文件的分割符不是默認的空格,那就用-F選項(不是-f)來指定一個或者多個符號作爲分隔符,比如 -F"[,;]",表示逗號和冒號都是分割符,如果僅用逗號,則-F","
2. BEGIN和END後的語句僅執行一次,其中前者是在逐行處理輸入之前進行,後者是在處理完每行輸入之後進行。所以,如果把處理每行數據看做是個循環的話,那麼BEGIN主要可以用來設置一下全局變量,而END則可以用來對處理結果進行統計分析和輸出等。
3. NF:全局變量,表示每一行的字段的數目。$0表示該行的內容,$1表示該行第一個字段,以此類推。
4. Number[$1]:這是個類似於python的字典的東西,但是它其實是個數列,只是可以這樣用而已。