1. 程式人生 > >每日一題--2

每日一題--2

重復 重復出現的字符 兼容 函數 aaa -bash 出現的次數 指定 數據

題目2 統計字符串

使用awk統計出來指定字符串中重復出現的字符並重復出現了幾次,現在只考慮有數字和字母,先區分大小寫
eg:
aaabbc------> a 重復出現3次,b重復出現了2次
abababdcac--> a 重復出現了4次,b重復出現了3次,c重復出現了2次

第一個裏程碑:
先不考慮樣式和要求,先輸出所有字符串出現的次數

//我們先使用awk把單個字符串取出來
[root@web01-7 /]# echo "aaabbc" | awk -F "" ‘{$1=$1;print $0}‘
a a a b b c
//$1=$1我們可以發現他其實裏面的原始值沒有變,但是我們這樣寫就是為了讓awk的數據重構
[root@web01-7 /]# echo "aaabb" | awk -F  "" ‘{for(i=1;i<=NF;i++){sum[$i]++}}END{for(j in sum)print sum[j],j}‘ 
3 a
2 b
1 c
//使用awk數據求和來取出每個字母出現的次數,並輸出

第二個裏程碑:
把重復出現2次以上的給打印出來,只出現1次的不打印

[root@web01-7 /]# echo "aaabbc" | awk -F  "" ‘{for(i=1;i<=NF;i++){sum[$i]++}}END{for(j in sum)if(sum[j]>=2)print sum[j],j}‘ 
3 a
2 b

第三個裏程碑
按照題目要求的格式化輸出

echo "aaabbc" | awk -F  "" ‘{for(i=1;i<=NF;i++) {sum[$i]++}} END{{ for (j in sum) if ( sum[j]>=2 ) printf"%s重復出現%s次\t",j, sum[j]} printf"\n"}‘

進階版:不區分大小統計(應該能簡化??)

[root@web01-7 /]# echo "AAaaabbc" | awk ‘{print tolower($0)}‘ | awk -F  "" ‘{for(i=1;i<=NF;i++) {sum[$i]++}} END{{ for(j in sum) if ( sum[j]>=2 ) printf"%s 重復出現%次 \",j, sum[j]} printf"\n"}‘                      
a重復出現5次    b重復出現2次

總結

1,awk可以使用-F "" 這種方式來分割單個字符
2,awk中可以使用函數tolower()把所有大寫的字母替換成小寫的

3,awk中可以使用函數toupper()把所有小寫的字母替換成大寫的
4,也可以使用BEGIN{IGNORECASE=1}來屏蔽awk匹配的時候區分大小寫,要記得這個在awk的兼容模式下不能用

每日一題--2