awk循環處理文本進行統計

由於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的字典的東西,但是它其實是個數列,只是可以這樣用而已。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章